有一份记事本文档,是从 Windows 10 复制到 Windows 11 的,编码为 UTF-8-BOM,其中包含中文、日文假名、越南文、数字,以及下划线等符号。昨天突然发现在 Windows 11 中用记事本打开时越南文中特有的字母,比如 ệ,显示成了一个方框(如下图,Xuất phát 的 ấ 显示异常),但是用 Notepad++ 等其他编辑器打开都能正常显示。
通过咨询 ChatGPT,最初以为是字体缺失和编码不正确等原因,但是都被否定了。继续给 ChatGPT 提供线索,最终通过以下信息确认了问题所在:
1. 在 Windows 11 中新建记事本,手动输入越南文(例如:”Thắng lợi”)。打开 Windows 10 拷贝过来的文件,复制里面“显示异常”的同一个词,显示竟然是正常的。
2. 把有问题的文件的全部内容追加到刚才在 Windows 11 新建的显示正常的文件末尾,原来正常的部分你还是正常,而追加的部分显示异常。
100% 可以确认,有问题的文件里,某一行或开头残留了某种控制字符或格式标记,影响了记事本的渲染环境(可能是段落方向、文字范围、字体回退机制等),一旦追加进另一个文件,就从追加位置开始影响下去。
简单来说,这个问题不是某些字母不能显示,而是“有一段看不见的脏东西躲在文件中一开始,或者某一段文本块的某行开头,把整个 Windows 11 记事本的显示逻辑污染掉了”。
可能的元凶字符包括:
| 控制字符名称 | Unicode码点 | 说明 |
|---|---|---|
| BOM (重复或中间插入) | U+FEFF | 不该在正文中出现,可能存在错误 |
| LRM / RLM | U+200E / U+200F | 控制左右文字方向的隐形字符 |
| Line Separator | U+2028 | 非标准换行符 |
| Object Replacement | U+FFFC | 隐藏嵌入对象/损坏字符 |
| Embedded Font Tag | 私有机制 | 某些程序嵌入了字体标识(已知 Windws 10 某些 OEM 软件做过) |
精准解决思路:使用 Python 清理原始文件的“隐形污染字符”
Python 代码:
import unicodedata
import re
with open("原始有问题的文件.txt", "r", encoding="utf-8") as f:
content = f.read()
# 将所有字符归一化为标准 NFC 形式(合并组合字符)
content = unicodedata.normalize("NFC", content)
# 移除常见污染控制字符(包括 BOM 重复、方向标志等)
cleaned = re.sub(r'[\u200B-\u200F\u2028-\u202F\uFEFF\uFFF9-\uFFFC]', '', content)
with open("修复后.txt", "w", encoding="utf-8") as f:
f.write(cleaned)
print("文件已清理并保存为 UTF-8 无 BOM")
这个脚本会做三件事:
1. 把所有分解的字符组合成标准字母(越南语中的组合字母会统一)
2. 删除所有看不见的“污染控制符”
3. 输出干净的 UTF-8 文本文件
欢迎分享或转载,转载请注明出处。
本文固定链接:https://www.oixxu.com/windows-11-vietnamese-letter-error-solved
