如何仅使用 ASCII 定义 PHP 中的 Unicode 字符?
How can I define Unicode characters in PHP using ASCII only?
由于我们的PHP代码在不同的环境下是运行,我们不控制(也不知道编码),想法是不使用任何none-源代码中的ASCII字符。
然而,代码中有几个地方定义了包含 none-ASCII 字符的字符串文字,例如 'TextWithÜ'.
有没有办法只使用 ASCII 来写“Ü”?
我能想到的最好的办法是使用HTML-notation 并对其进行解码。
html_entity_decode('TextWithÜ');
但是,由于我们不知道系统的默认编码,我也必须检测它:
html_entity_decode('TextWithÜ', ENT_COMPAT | ENT_HTML401, ini_get('default_charset'));
并且 html_entity_decode 仅支持 ini_get('default_charset')
的一个子集,这就是为什么有时可能会失败的原因。
有没有更好的方法?
- 如果您要发送源代码文件,则可以控制它们的编码。如果您以 UTF-8 编码保存文件,all string literals inside that file will be UTF-8 encoded。人们必须有目的地转换文件的编码以更改它,这几乎不会因意外或某些错误配置而发生。
如果你还在担心这个,最好的方法可能是直接将字符串表示为字节:
$str = "TextWith\xC3\x9C"; // "Ü"
这对于写入和读取来说都会有些麻烦,但这是与系统无关地生成具有特定编码内容的字符串的最直接方法。
假设您 运行 您的文件作为包含在另一个应用程序中的文件,并且您担心您不知道其他应用程序需要什么编码,您将创建一个 "encoding sandwich"。您的代码位于中间并使用一种标准化编码(最好是 UTF-8),并且 "edges" 与其他周围代码所期望的相互转换。这意味着您需要定义边界,定义其他代码与之交互的功能。在所有输入点上,您可以执行以下操作:
function take_input($input) {
$input = iconv(App::externalEncoding(), 'UTF-8', $input);
...
}
在所有 return 数据到其他代码的地方,你会做:
function return_output() {
...
return iconv('UTF-8', App::externalEncoding(), $output);
}
从其他应用的角度来看,这看起来像:
require_once 'JochensCode.php';
App::externalEncoding('SJIS');
take_input('文字化け');
echo return_output();
由于我们的PHP代码在不同的环境下是运行,我们不控制(也不知道编码),想法是不使用任何none-源代码中的ASCII字符。
然而,代码中有几个地方定义了包含 none-ASCII 字符的字符串文字,例如 'TextWithÜ'.
有没有办法只使用 ASCII 来写“Ü”?
我能想到的最好的办法是使用HTML-notation 并对其进行解码。
html_entity_decode('TextWithÜ');
但是,由于我们不知道系统的默认编码,我也必须检测它:
html_entity_decode('TextWithÜ', ENT_COMPAT | ENT_HTML401, ini_get('default_charset'));
并且 html_entity_decode 仅支持 ini_get('default_charset')
的一个子集,这就是为什么有时可能会失败的原因。
有没有更好的方法?
- 如果您要发送源代码文件,则可以控制它们的编码。如果您以 UTF-8 编码保存文件,all string literals inside that file will be UTF-8 encoded。人们必须有目的地转换文件的编码以更改它,这几乎不会因意外或某些错误配置而发生。
如果你还在担心这个,最好的方法可能是直接将字符串表示为字节:
$str = "TextWith\xC3\x9C"; // "Ü"
这对于写入和读取来说都会有些麻烦,但这是与系统无关地生成具有特定编码内容的字符串的最直接方法。
假设您 运行 您的文件作为包含在另一个应用程序中的文件,并且您担心您不知道其他应用程序需要什么编码,您将创建一个 "encoding sandwich"。您的代码位于中间并使用一种标准化编码(最好是 UTF-8),并且 "edges" 与其他周围代码所期望的相互转换。这意味着您需要定义边界,定义其他代码与之交互的功能。在所有输入点上,您可以执行以下操作:
function take_input($input) {
$input = iconv(App::externalEncoding(), 'UTF-8', $input);
...
}
在所有 return 数据到其他代码的地方,你会做:
function return_output() {
...
return iconv('UTF-8', App::externalEncoding(), $output);
}
从其他应用的角度来看,这看起来像:
require_once 'JochensCode.php';
App::externalEncoding('SJIS');
take_input('文字化け');
echo return_output();