由于我们的PHP代码在不同的环境中运行,我们无法控制(我们不知道编码),我们的想法是不在源代码中使用任何非ASCII字符。
但是代码中有一些地方,其中定义了包含非ASCII字符的字符串文字,例如'TextWithÜ'。
有没有办法只用ASCII编写'Ü'?
我能想到的最好的方法是使用HTML表示法并对其进行解码。
html_entity_decode('TextWithÜ');
但是,由于我们不知道系统默认编码,我也必须检测到它:
html_entity_decode('TextWithÜ', ENT_COMPAT | ENT_HTML401, ini_get('default_charset'));
并且html_entity_decode仅支持ini_get('default_charset')
的一部分,这就是有时可能失败的原因。
有更好的方法吗?
答案 0 :(得分:4)
如果您仍然担心这一点,最好的方法可能是直接将字符串表示为字节:
$str = "TextWith\xC3\x9C"; // "Ü"
这对于写入和读取来说都有些麻烦,但却是系统非常直接地生成具有特定编码内容的字符串的方法。
假设您将文件作为其他应用中的附带文件运行,并且您担心的是您不知道其他应用所期望的编码,那么您将创建一个"编码三明治&#34 ;。您的代码位于中间,使用一种标准化编码(最好是UTF-8),使用" edge"转换为其他周围代码所期望的内容。这意味着您需要定义边框,其他代码与之交互的已定义函数。在所有输入点上,您可以执行以下操作:
function take_input($input) {
$input = iconv(App::externalEncoding(), 'UTF-8', $input);
...
}
在将数据返回到其他代码的所有点上,您都可以:
function return_output() {
...
return iconv('UTF-8', App::externalEncoding(), $output);
}
从其他应用程序的角度来看,这看起来像是:
require_once 'JochensCode.php';
App::externalEncoding('SJIS');
take_input('文字化け');
echo return_output();