如何仅使用ASCII在PHP中定义Unicode字符?

时间:2015-02-17 12:34:26

标签: php encoding utf-8 html-entities

由于我们的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')的一部分,这就是有时可能失败的原因。

有更好的方法吗?

1 个答案:

答案 0 :(得分:4)

  1. 如果您要发送源代码文件,则可以控制其编码。如果以UTF-8编码保存文件,all string literals inside that file will be UTF-8 encoded。人们必须有目的地转换文件的编码来改变它,这很难发生意外或一些错误配置。
  2. 如果您仍然担心这一点,最好的方法可能是直接将字符串表示为字节:

    $str = "TextWith\xC3\x9C"; // "Ü"
    

    这对于写入和读取来说都有些麻烦,但却是系统非常直接地生成具有特定编码内容的字符串的方法。

  3. 假设您将文件作为其他应用中的附带文件运行,并且您担心的是您不知道其他应用所期望的编码,那么您将创建一个"编码三明治&#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();