编码非低位ASCII字符

时间:2019-08-28 23:33:34

标签: php encoding

我正在尝试将PHP中的Hügelkultur之类的字符串编码为Hügelkultur

我正在尝试使用htmlentities(str)htmlentities(str, ENT_XML1)之类的方法,但是它保持不变。 urlencode(str)给了我H%C3%BCgelkultur,但这不是我想要得到的。

我应该使用什么功能?这种编码有名称吗?

1 个答案:

答案 0 :(得分:2)

没有内置的功能,因为只有在您错误地处理其他更重要的事情时才遇到此问题,而这只是将其覆盖在纸上。

请参阅:UTF-8 all the way through

但是,如果您承诺不实际修复该问题并使您的应用程序更难以维护,则可以使用以下代码将127以上的UTF-8代码点编码为HTML实体:

function force_utf8_entities($input) {
    return implode('', array_map(
        function($a){
            if( strlen($a) > 1 ) {
                return sprintf("&#x%X;", mb_ord($a));
            }
            return $a;
        },
        mb_str_split($input)
    ));
}

$input = "Hügelkultur";
var_dump(
    force_utf8_entities($input)
);

还值得注意的是,没有“非低位ASCII”之类的东西,因为序数表示形式大于127的每个字节完全受声明的编码的支配。 UTF,ISO8859-X和MS cpXXXX编码都会对这些字节在屏幕上表示的内容产生不同意见。

这是“ 7位安全”一词的来历,因为无论您在传输过程中对编码进行多么糟糕的处理,您都可以合理地确定127以下的字节能够通过它。

编辑

“扩展ASCII”仍然不是问题。

如果在127以上显示一个字节,则屏幕上显示的符号将有所不同,具体取决于其所解释的编码。使用西欧字母的人有些受宠若惊,因为我们有趣的带重音符号的字母往往是默认值[ISO8859-1和cp1252],但是当您切换到东欧字符集[ISO8859-5和cp1251]时,您会看到{{ 1}},而不是ќ

值得注意的是,ü中的FC不是字节值,它是未编码的UTF代码点。同样,西欧字母的用户由于代码点空间的重叠而被破坏,并且经常被混淆。编码为UTF-8的ü是字面的两字节序列uFC。因此您的C3 BC输出。

真的,事实是根本没有“ ASCII”之类的东西。只是大多数非亚洲编码都倾向于同意,将传统的前127个字节在各处都保持相同会更容易,以免吓坏英国人。