首页 > 解决方案 > 编码非低位 ASCII 字符

问题描述

我正在尝试将HügelkulturPHP 中的字符串编码为Hügelkultur.

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

我应该使用什么功能?这种类型的编码有名字吗?

标签: phpencoding

解决方案


没有内置的,因为只有当你错误地做其他更重要的事情时才会遇到这个问题,而这只是掩盖了它们。

请参阅:UTF-8 一直到

但是,如果您承诺不实际修复该问题并使您的应用程序更难以维护,您可以使用以下代码将 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] 时,你会看到ќ而不是ü.

值得注意的是,FCinü不是字节值,它是未编码的 UTF 码位。同样,西欧字母的用户被代码点空间中的重叠宠坏了,并且经常感到困惑。uFC编码为 UTF-8 的是文字的两字节序列C3 BC。因此你的urlencode()输出。

真的,事实是根本没有“ASCII”这样的东西。只是大多数非亚洲编码倾向于同意让传统的前 127 个字节在任何地方都保持不变更容易,以免吓坏英国人。


推荐阅读