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

如何仅使用ASCII在PHP中定义Unicode字符?,php,encoding,utf-8,html-entities,Php,Encoding,Utf 8,Html Entities,因为我们的PHP代码运行在不同的环境中,所以我们不控制(并且我们不知道的编码),我们的想法是在源代码中不使用任何非ASCII字符 但是,代码中有一些地方定义了不包含ASCII字符的字符串文字,如“TextWithÜ” 有没有一种方法可以只使用ASCII编写“Ü” 我能想到的最好方法就是使用HTML符号并对其进行解码 html_entity_decode('TextWithÜ'); 但是,由于我们不知道系统默认编码,因此我还必须检测: html_entity_decode('T

因为我们的PHP代码运行在不同的环境中,所以我们不控制(并且我们不知道的编码),我们的想法是在源代码中不使用任何非ASCII字符

但是,代码中有一些地方定义了不包含ASCII字符的字符串文字,如“TextWithÜ”

有没有一种方法可以只使用ASCII编写“Ü”

我能想到的最好方法就是使用HTML符号并对其进行解码

html_entity_decode('TextWithÜ');
但是,由于我们不知道系统默认编码,因此我还必须检测:

html_entity_decode('TextWithÜ', ENT_COMPAT | ENT_HTML401, ini_get('default_charset'));
并且只支持
ini\u get('default\u charset')
的子集,这就是为什么有时可能会失败的原因

有更好的办法吗

  • 如果您正在传送源代码文件,那么您可以控制它们的编码。如果以UTF-8编码保存文件。我们必须有目的地转换文件的编码来改变这一点,这几乎不是偶然发生的,也不是一些错误的配置
  • 如果您仍然担心这个问题,最好的方法可能是将字符串直接表示为字节:

    $str = "TextWith\xC3\x9C"; // "Ü"
    
    这对写和读都有点麻烦,但这是系统不可知地生成具有特定编码内容的字符串的最直接方法

  • 假设您正在另一个应用程序中以包含文件的形式运行您的文件,您担心的是您不知道另一个应用程序需要什么编码,那么您将创建一个“编码三明治”。您的代码位于中间,并使用一个标准化编码(最好是UTF-8),其中“边缘”转换为其他周围代码所期望的。这意味着您需要定义边界,定义其他代码与之交互的函数。在所有输入点上,您可以执行以下操作:

    function take_input($input) {
        $input = iconv(App::externalEncoding(), 'UTF-8', $input);
        ...
    }
    
    require_once 'JochensCode.php';
    
    App::externalEncoding('SJIS');
    
    take_input('文字化け');
    echo return_output();
    
    在将数据返回到其他代码的所有点上,您应该执行以下操作:

    function return_output() {
        ...
        return iconv('UTF-8', App::externalEncoding(), $output);
    }
    
    从另一个应用程序的角度来看,这看起来像:

    function take_input($input) {
        $input = iconv(App::externalEncoding(), 'UTF-8', $input);
        ...
    }
    
    require_once 'JochensCode.php';
    
    App::externalEncoding('SJIS');
    
    take_input('文字化け');
    echo return_output();
    
  • 如果您正在传送源代码文件,那么您可以控制它们的编码。如果以UTF-8编码保存文件。我们必须有目的地转换文件的编码来改变这一点,这几乎不是偶然发生的,也不是一些错误的配置
  • 如果您仍然担心这个问题,最好的方法可能是将字符串直接表示为字节:

    $str = "TextWith\xC3\x9C"; // "Ü"
    
    这对写和读都有点麻烦,但这是系统不可知地生成具有特定编码内容的字符串的最直接方法

  • 假设您正在另一个应用程序中以包含文件的形式运行您的文件,您担心的是您不知道另一个应用程序需要什么编码,那么您将创建一个“编码三明治”。您的代码位于中间,并使用一个标准化编码(最好是UTF-8),其中“边缘”转换为其他周围代码所期望的。这意味着您需要定义边界,定义其他代码与之交互的函数。在所有输入点上,您可以执行以下操作:

    function take_input($input) {
        $input = iconv(App::externalEncoding(), 'UTF-8', $input);
        ...
    }
    
    require_once 'JochensCode.php';
    
    App::externalEncoding('SJIS');
    
    take_input('文字化け');
    echo return_output();
    
    在将数据返回到其他代码的所有点上,您应该执行以下操作:

    function return_output() {
        ...
        return iconv('UTF-8', App::externalEncoding(), $output);
    }
    
    从另一个应用程序的角度来看,这看起来像:

    function take_input($input) {
        $input = iconv(App::externalEncoding(), 'UTF-8', $input);
        ...
    }
    
    require_once 'JochensCode.php';
    
    App::externalEncoding('SJIS');
    
    take_input('文字化け');
    echo return_output();
    

    我有点不清楚你到底关心什么。你能澄清一下在这些环境中你到底不能控制什么,以及在哪里你可能会看到由于编码问题而导致的失败吗?首先,使用ASCII是个坏主意,你最好使用UTF-8。对不起,我不太清楚你到底关心什么。你能澄清一下在这些环境中你到底不能控制什么,以及在哪里你可能会看到由于编码问题而导致的失败吗?首先,使用ASCII是个坏主意,你最好使用UTF-8。对不起,但是我