【发布时间】:2016-02-02 04:42:58
【问题描述】:
在寻找 open(FILE, '<:utf8', $file) or die; seek(FILE, $readFrom, 0); read(FILE, $_, $size); 之后读取 utf8 编码文件有时会“分解”一个 unicode 字符,因此读取字符串的开头不是有效的 UTF-8。
如果你这样做,例如s{^([^\n]*\r?\n)}{}i 去除不完整的第一行,您会收到“格式错误的 UTF-8 字符(致命)”错误。
如何解决这个问题?
How do I sanitize invalid UTF-8 in Perl? 中列出的一种解决方案是删除所有无效的 UTF-8 字符:
tr[\x{9}\x{A}\x{D}\x{20}-\x{D7FF}\x{E000}-\x{FFFD}\x{10000}-\x{10FFFF}][]cd;
但是,搜索整个字符串似乎有点过头了,因为只有读取字符串中的第一个字节可以被破坏。
任何人都可以建议一种方法来仅去除初始的无效字符(或使上述替换不会在格式错误的 UTF-8 上消失)吗?
【问题讨论】:
-
仅将
tr应用于第一个字符? -
这不应该发生,请参阅
perldoc -f read注意字符: ...默认情况下,所有文件句柄都在字节上操作,但是...如果文件句柄已使用 " :utf8" I/O 层 I/O 将在 UTF-8 编码的 Unicode 字符上运行,而不是字节请给出一个最小的例子 -
tr去掉了至少 29 个有效字符!!!