PHP批量处理confusables.txt生成Unicode字符映射表格问题
修正方案
核心问题定位
- 原代码仅针对单个硬编码目标字符串,未遍历所有拉丁大写字母的匹配规则
- Unicode字符处理未使用多字节安全函数,导致字符解析错误、混排
- 缺少分组存储结构,无法按原拉丁字母归类,只能输出单行内容
修正后的PHP实现
<?php // 定义目标文件路径 $filePath = 'confusables.txt'; // 初始化分组数组,按拉丁大写字母存储混淆字符 $groups = []; // 逐行读取文件 $handle = fopen($filePath, 'r'); if ($handle) { // 正则匹配规则:提取原拉丁大写字母、混淆字符的Unicode编码 $pattern = '/U\+([0-9A-F]{4,6}) ; LATIN CAPITAL LETTER ([A-Z]) ; U\+([0-9A-F]{4,6})/'; while (($line = fgets($handle)) !== false) { // 跳过注释或空行 if (trim($line) === '' || str_starts_with($line, '#')) { continue; } if (preg_match($pattern, $line, $matches)) { $originalLetter = $matches[2]; // 将Unicode编码转换为实际字符(多字节安全) $confusableChar = mb_chr(hexdec($matches[3]), 'UTF-8'); // 按原字母分组存储 $groups[$originalLetter][] = $confusableChar; } } fclose($handle); // 按字母顺序排序分组 ksort($groups); // 生成按字母分组的Markdown表格 foreach ($groups as $letter => $chars) { echo "## 拉丁大写字母 $letter\n"; echo "| 原字母 | 混淆字符 |\n"; echo "|--------|----------|\n"; foreach ($chars as $char) { // 转义Markdown特殊字符(如果有) $escapedChar = htmlspecialchars($char); echo "| $letter | $escapedChar |\n"; } echo "\n"; } } else { die('无法打开文件:' . $filePath); } ?>
关键修正点说明
- 分组逻辑:用
$groups数组按原拉丁字母(A-Z)归类混淆字符,解决单行输出问题 - Unicode安全处理:使用
mb_chr函数转换Unicode编码为字符,避免多字节字符解析错误导致的混排 - 正则匹配优化:精准匹配confusables.txt的行格式,提取所需的原字母和混淆字符编码
- 排序输出:对分组数组按字母顺序排序,保证输出的表格按A-Z顺序排列
示例输出效果
## 拉丁大写字母 A | 原字母 | 混淆字符 | |--------|----------| | A | Α | | A | А | ## 拉丁大写字母 B | 原字母 | 混淆字符 | |--------|----------| | B | В |
内容的提问来源于stack exchange,提问作者first
相关产品推荐
相关产品推荐

