php - 编码非低位 ASCII 字符
问题描述
我正在尝试将Hügelkultur
PHP 中的字符串编码为Hügelkultur
.
我正在尝试类似的东西htmlentities(str)
,htmlentities(str, ENT_XML1)
但它保持不变。urlencode(str)
给了我H%C3%BCgelkultur
,但这不是我想要得到的。
我应该使用什么功能?这种类型的编码有名字吗?
解决方案
没有内置的,因为只有当你错误地做其他更重要的事情时才会遇到这个问题,而这只是掩盖了它们。
请参阅: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] 时,你会看到ќ
而不是ü
.
值得注意的是,FC
inü
不是字节值,它是未编码的 UTF 码位。同样,西欧字母的用户被代码点空间中的重叠宠坏了,并且经常感到困惑。uFC
编码为 UTF-8 的是文字的两字节序列C3 BC
。因此你的urlencode()
输出。
真的,事实是根本没有“ASCII”这样的东西。只是大多数非亚洲编码倾向于同意让传统的前 127 个字节在任何地方都保持不变更容易,以免吓坏英国人。
推荐阅读
- azure-devops - 如何为 Nuget 工件配置 Azure Devops Pipeline 包名称
- api - 赛普拉斯 API 响应为数组,但断言失败
- html - 可以用css设置数据属性吗?如果是这样,那怎么办?
- r - R在保留标题的同时将数据帧的值向左移动
- mysql - 在mysql中根据条件添加一个布尔列
- fortran - Fortran 函数可以返回多个变量吗?
- angular - Angular Routing 获取先前的参数
- c++ - 在基于迭代器的循环中增长向量在使用 munmap_chunk() 进行破坏时崩溃:无效指针,为什么?
- php - htaccess 在索引页面上发布时不会触发 [自定义 PHP MVC]
- javascript - 不仅在悬停时移动 div,而且在另一个 div 到达顶部时移动