如何仅使用 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') 的一个子集,这就是为什么有时可能会失败的原因。

有没有更好的方法?

  1. 如果您要发送源代码文件,则可以控制它们的编码。如果您以 UTF-8 编码保存文件,all string literals inside that file will be UTF-8 encoded。人们必须有目的地转换文件的编码以更改它,这几乎不会因意外或某些错误配置而发生。
  2. 如果你还在担心这个,最好的方法可能是直接将字符串表示为字节:

    $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();