如何检测具有不可打印字符的unicode字符串?

时间:2010-10-02 10:56:41

标签: c# unicode character-encoding

我将Unicode字符串存储在数据库中。一些字符编码是错误的,而不是显示语言的实际字符,它现在显示没有意义的字符。我该如何解决这个问题?有没有办法检测字符串是否有错误的编码?

1 个答案:

答案 0 :(得分:3)

mojibake的问题(日语俚语“mojibake”在英语中被使用,因为日本作为一个非西方国家的历史地位,早期的计算机使用意味着这个问题遇到了很多)是角色一般它本身是有效的,但是无意义,这种方法难以100%准确地检测到。

您需要做的第一件事是确定数据实际所在的编码,读取数据的编码,然后编写转换器以撤消该数据。

例如,如果UTF-8被误解为ISO 8859-1,那么您需要读取流,并创建将其编码回ISO 8859-1的二进制流,然后创建将二进制流读取为UTF-8的文本流,应该首先完成。

现在,对于困难的部分,找到不正确的流。如果你可以通过某种非启发式的方式来做到这一点,那么这就是要走的路(例如,如果你知道在特定范围的id号码中添加的每条记录都是无效的,那就使用它。)

如果做不到这一点,最好的办法是按照以下方式进行一些启发式方法:

  1. 如果文本中的字符不是图形字符,则可能是由于这个mojibake问题造成的。
  2. 在给定的mojibake情况下,某些序列会很常见。例如,UTF-8中的é误解为ISO 8859-1将成为é。因为é是真实数据中非常罕见的组合(关于你故意在故意看到的情况下,当有人在谈论它是如何出错时),那么包含它的任何文本几乎肯定是一个需要修复。如果您有一些原始数据,您可以通过识别原始数据中两个编码不同的字符,并生成必要的序列(例如,如果我们发现ç出现在数据中),找到您需要查找的序列,我们发现这将有序列Ã,然后我们知道这是一个要查找的序列。
  3. 请注意,如果我们有与mojikbake对应的System.Text.Encoding对象,我们可以计算这样的序列。例如,如果您应该读取为UTF-8,那么您已将其读作系统的默认编码,那么您可以使用:

    Encoding.Default.GetString(Encoding.UTF8.GetBytes(testString))
    

    例如:

    Encoding.Default.GetString(Encoding.UTF8.GetBytes("ç"))
    

    返回“ç”。