在文本文件中查找非ASCII字符并将其转换为它们的Unicode等效形式。

7
我正在从远程服务器导入 .txt 文件并保存到数据库中。我使用一个 .Net 脚本来实现这个目的。有时候我会在文件内发现乱码字/字符 (Ullerهkersvنgen),这会在保存到数据库时出现问题。
我想要过滤所有这样的字符,并在保存到数据库之前将它们转换为 Unicode 编码。
注意:我已经阅读了许多类似的帖子,但没有成功。
非常感谢您在这方面提供的帮助。
谢谢。
2个回答

13

如果您的脚本确实知道文本片段的正确编码方式,那么这应该是查找所有非ASCII字符的正则表达式:

Assuming your script does know the correct encoding of your text snippet than that should be the regular expression to find all Non-ASCII charactres:
[^\x00-\x7F]+

看这里:https://dev59.com/o2Ei5IYBdhLWcg3w2fUm#20890052https://dev59.com/V2ox5IYBdhLWcg3w_JPd#8845398

此外,base-R工具包提供了两个函数来检测非ASCII字符:

tools::showNonASCII()
tools::showNonASCIIfile()

4
你需要知道或者至少猜测数据的字符编码,才能够正确地进行转换。因此,你应该尝试查找有关文本文件来源和格式的信息,并确保在软件中正确读取文件。
例如,“Ulleråkersvägen”看起来像是一个斯堪的纳维亚名字,里面有斯堪的纳维亚字母,但却因为错误的字符编码假设或不正确的字符代码转换而被误解。其中第一个阿拉伯字母“ه”,是U+06477 ARABIC LETTER HEH。在ISO-8859-6编码中,它是E7(十六进制);在windows-1256中,它是E5。由于斯堪的纳维亚文本通常以ISO-8859-1或windows-1252表示(当未使用Unicode编码时),自然要检查它们在这些编码中的含义:“ç”和“å”。出于语言学原因,后者在这里更有可能。第二个阿拉伯字母是“ن” U+0646 ARABIC LETTER NOON,在windows-1256中是E4。在ISO-8859-1中,E4是“ä”。这是很有道理的:这个词是“Ulleråkersvägen”,一个真实的瑞典街道名称(至少在乌普萨拉)。
因此,数据很可能是ISO-8859-1或Windows Latin 1编码的文本,被错误地解释为windows-1256(Windows Arabic)。不需要进行转换;您只需要将数据作为windows-1252编码的文本读取即可。(读取后,当然可以将其转换为另一种编码。)

是的,您说得100%正确。 “Ullerهkersvنgen”等同于“Ulleråkersvägen”。现在我们如何通过ASP.Net自动检测这些字符并相应地进行转换。 - Mehboob Afridi
2
@Mehboob,你做不到。在某些情况下,可能会应用一些启发式方法,但是仅从数据中推断字符编码的一般问题需要人类智慧和理解以及一些经验(并且可能是不可能的)。 - Jukka K. Korpela
1
我们不能使用正则表达式来捕获所有非ASCII字符,然后将它们转换为Unicode吗? - Mehboob Afridi
2
如果您知道编码,您就可以转换。因此,数据只是位。如果您不知道它应该表示哪个字符,您将把01100010转换为什么? - Jukka K. Korpela
1
你能给我一个代码示例吗?按照你刚才回答中解释的编码方式来实现就可以了,这样就可以了,正如我之前所说的。 - Mehboob Afridi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接