php - PHP:将字符转换为其(十进制)数字表示(在字符串中)
问题描述
我们正在做一个项目,我们必须模仿旧遗留系统的一些导出输出。
这些导出是基于文本的,并以 WINDOWS-1252 编码进行编码,其中特殊字符应以十进制/数字表示进行编码,例如α
应该是α
.
我尝试使用htmlspecialchars
,htmlentities
和mb_convert_encoding
- 不幸的是没有运气。
目前我正在遍历字符串的每个字符并检查它是否是 ASCII 字符。如果字符不是有效的 ASCII,我将使用 将其转换为十进制表示mb_ord
,请参阅我的函数:
private function transformString(string $str)
{
if (mb_check_encoding($str, 'ASCII') === true) {
return $str;
} else {
$characters = preg_split('//u', $str, -1, PREG_SPLIT_NO_EMPTY);
$transformedString = '';
foreach ($characters as $character) {
if (mb_check_encoding($character, 'ASCII') === false) {
$character = sprintf('&#%s;', mb_ord($character));
}
$transformedString .= $character;
}
return $transformedString;
}
}
这个解决方案似乎有效,但我很好奇这种转换是否有更清洁的方法?
提前致谢!
解决方案
该函数使用 preg_replace_callback() 替换所有非 ASCII 字符。
function encodeNonAscii($string){
return preg_replace_callback('/[^\x00-\x7F]/u',
function($match){
return '&#'.mb_ord($match[0]).';';
},
$string
);
}
只有一点点更短和更快。
推荐阅读
- javascript - 使用组件进行样式设置时页面未显示
- python - 在 pandas 中重新采样以将日期时间序列拆分为“n”分钟的桶和每个桶的计数
- css - Django - 管理区域宽度
- bash - Bash/Awk 比较两个文件,在坐标之间打印值,否则打印 0
- android - 如何在背景图像上添加多个图像
- google-apps-script - 如何在谷歌表格中的类似日期条目之后自动添加一个空白行?
- unity3d - Unity弹跳球奇迹般地长高了
- python - 通过给定范围的属性查询弹性搜索索引?
- javascript - 单击图像时如何将文本复制到剪贴板?
- javascript - 在 URL 更改时移除注入的 iframe | Chrome 扩展程序