我正在尝试将PHP中的Hügelkultur
之类的字符串编码为Hügelkultur
。
我正在尝试使用htmlentities(str)
和htmlentities(str, ENT_XML1)
之类的方法,但是它保持不变。 urlencode(str)
给了我H%C3%BCgelkultur
,但这不是我想要得到的。
我应该使用什么功能?这种编码有名称吗?
答案 0 :(得分:2)
没有内置的功能,因为只有在您错误地处理其他更重要的事情时才遇到此问题,而这只是将其覆盖在纸上。
但是,如果您承诺不实际修复该问题并使您的应用程序更难以维护,则可以使用以下代码将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个字节在各处都保持相同会更容易,以免吓坏英国人。