在文本文件中查找非ASCII字符并将其转换为其Unicode等效字符

时间:2013-05-23 11:34:24

标签: unicode character-encoding

我从远程服务器导入.txt文件并将其保存到数据库。我为此目的使用.Net脚本。我有时会注意到文件中出现乱码/字符(Ullerهkersvنgen),这会在保存到数据库时出现问题。

我希望在保存到数据库之前过滤所有这些字符并将它们转换为unicode。

注意:我经历了很多类似的帖子,但没有运气。

在此背景下,您的帮助将受到高度赞赏。

感谢。

2 个答案:

答案 0 :(得分:11)

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

[^\x00-\x7F]+

请参阅此处:https://stackoverflow.com/a/20890052/1144966https://stackoverflow.com/a/8845398/1144966

此外,base-R工具包提供了两个检测非ASCII字符的功能:

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

答案 1 :(得分:4)

您需要知道或至少猜测数据的字符编码才能正确转换。因此,您应该尝试查找有关文本文件的来源和格式的信息,并确保在软件中正确读取文件。

例如,“Ullerهkersvنgen”看起来像斯堪的纳维亚名字,里面有斯堪的纳维亚字母,根据错误的字符编码假设误解,或者由于错误的字符代码转换而被误解。其中的第一个阿拉伯字母“ه”是U+064 7阿拉伯语字母HEH。在ISO-8859-6编码中,它是E7(十六进制);在windows-1256中,它是E5。由于斯堪的纳维亚文本通常用ISO-8859-1或windows-1252表示(当不使用Unicode编码时),因此检查E7和E5在其中的含义是很自然的:“ç”和“å”。出于语言原因,后者在这里更有可能。第二个阿拉伯字母是“ن”U + 0646 ARABIC LETTER NOON,在Windows-1256中是E4。在ISO-8859-1中,E4是“ä”。这是完全合理的:这个词是“Ulleråkersvägen”,一个真正的瑞典街道名称(至少在乌普萨拉)。

因此,数据可能是ISO-8859-1或Windows-1252(Windows Latin 1)编码文本,错误地解释为windows-1256(Windows阿拉伯语)。不需要转换;你需要读取数据作为windows-1252编码。 (阅读后,它当然可以转换为另一种编码。)