gpt4 book ai didi

python - 从文件中去除 UTF-8 字符范围的脚本

转载 作者:太空宇宙 更新时间:2023-11-03 12:44:50 25 4
gpt4 key购买 nike

我的问题是我有一个包含 UTF-8 的数据文件,其中大部分是有效的并且必须保留,但其中一些具有随机“垃圾​​”UTF-8,即在 0xf0 范围内 - 0xff。坏数据的十六进制示例如下所示

 f4 80 80  ab f4 80 80 b6 f4 80 80 
a5 f4 80 80 a6 f4 80 80 83 f4 80 80 b6 f4 80 81
84 f4 80 81 98 f4 80 81 87 f4 80 81 8c f4

我正在尝试编写一个 perl 脚本来搜索和替换第一个字节在 0xf0 - 0xff 范围内的字符。在 this website代码页被列为私有(private)使用。

我现有的尝试要么什么都不做,要么只能删除多字节字符的第一个字节,例如 perl -CSD -pi.orig -e 's/[\x{f4} -\x{ff}]/?/g' 运行 perl v5.12.5

我不是 perl 专家,也不是 utf-8 专家。我也愿意在 ruby​​/python/C++(98) 中做这件事,只要它在 linux 机器上相对便携。

这是指向垃圾数据片段的链接。 http://pastebin.com/LR0StPHu

最佳答案

好吧,我们不要混淆一些事情。

第一个字节为 0xf0 的 UTF-8 字符有四个字节长,这是编码合法 Unicode 字符所需的最多字节。由于超过 94% 的可能 Unicode 范围需要第四个字节,0xf0 不会映射到任何单个代码页,当然也不会映射到专用区域。

这些字符 Basic Multilingual Plane 之外.但这不同于无效或私有(private)使用;这只是意味着它们的代码点大于 U+FFFF(十进制值 65,535)。

如果您想排除 BMP 之外的所有字符,您应该搜索与此正则表达式匹配的字符:

[\x{10000}-\x{10FFFF}]

它使用 Perl 的 \x{...} 插值语法通过十六进制代码点值包含字符。如果您实际上使用的是 Perl,那么为了便于使用,您可能希望将正则表达式放入变量中(使用引号-正则表达式构造 qr(...) ,因为裸斜线会在分配时立即尝试将正则表达式与 $_ 匹配):

my $not_bmp = qr([\x{10000}-\x{10FFFF}]);

但是,同样,删除与正则表达式匹配的字符会删除超过 94% 的可能的 Unicode 字符,因此请确保这就是您想要的。

如果您真的只想消除私有(private)字符 - 其中一些在 BMP 内部 - 只需专门排除这些范围即可。使用 Perl 或 Python 或任何其他支持 UTF-8 的语言,您不必担心字节;只需检查代码点。

作为Wikipedia会告诉你,三个私有(private)使用区域在这些代码点范围内:

  • U+E000..U+F8FF
  • U+F0000..U+FFFFF
  • U+100000..U+10FFFF

因此相应的 Perl 正则表达式如下所示:

my $pua = qr([\x{e000}-\x{f8ff}\x{f0000}-\x{fffff}\x{100000}-\x{10ffff}]);

许多其他语言也有类似的 Unicode 支持(与 UTF-8 字符匹配,包括字符串中按代码点的字符等)。例如,这里是 Ruby,主要区别在于使用 \u{...} 而不是 \x{...} 进行插值:

not_bmp = %r([\u{10000}-\u{10FFFF}])
pua = %r([\u{e000}-\u{f8ff}\u{f0000}-\u{fffff}\u{100000}-\u{10ffff}])

Python \u 转义仅适用于恰好四个十六进制数字,但如果您有 Python3 - 或在 wide 模式下编译的 Python2 - 您可以使用大写 \U,正好需要八个(Perl 和 Ruby 没有通过 {...} 支持可变长度):

not_bmp = re.compile(u'[\U00010000-\U0010ffff]')
pua = re.compile(u'[\ue000-\uf8ff\U000f0000-\U000fffff\U00100000-\U0010ffff]')

关于python - 从文件中去除 UTF-8 字符范围的脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42094797/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com