C# 如何检测带有不可打印字符的unicode字符串?

C# 如何检测带有不可打印字符的unicode字符串?,c#,unicode,character-encoding,C#,Unicode,Character Encoding,我将Unicode字符串存储在数据库中。有些字符编码是错误的,它现在显示的不是该语言的实际字符,而是毫无意义的字符。如何解决此问题?有没有办法检测字符串是否有错误的编码?mojibake(日语俚语“mojibake”在英语中被使用,因为日本作为一个早期大量使用计算机的非西方国家的历史地位意味着这个问题在那里经常遇到)的问题是,字符本身通常是有效的,但是毫无意义,要100%准确地检测出来要困难得多 您需要做的第一件事是识别数据真正使用的编码,数据读取时使用的编码,并编写一个转换器来撤销该编码 例如

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

mojibake(日语俚语“mojibake”在英语中被使用,因为日本作为一个早期大量使用计算机的非西方国家的历史地位意味着这个问题在那里经常遇到)的问题是,字符本身通常是有效的,但是毫无意义,要100%准确地检测出来要困难得多

您需要做的第一件事是识别数据真正使用的编码,数据读取时使用的编码,并编写一个转换器来撤销该编码

例如,如果UTF-8被错误地解释为ISO 8859-1,那么您可能希望读取该流,并创建将其编码回ISO 8859-1的二进制流,然后创建将该二进制流读取为UTF-8的文本流,这是第一步应该做的

现在是最难的部分,找到不正确的流。如果您可以通过一些非启发式的方法来实现这一点,那么这就是方法(例如,如果您知道在特定的id号范围内添加的每个记录都是无效的,请使用该方法)

如果不能做到这一点,您最好的办法是进行如下启发:

  • 如果文本中的字符不是图形字符,那么它可能是由mojibake问题引起的
  • 在给定的mojibake情况下,某些序列是常见的。例如,UTF-8中错误解释为ISO 8859-1的é将变为Ã)。由于é在真实数据中是一种极为罕见的组合(在这种情况下,当有人谈论它是如何错误地出现的时候,你才会有意识地看到它),那么任何包含它的文本几乎肯定都需要修复。如果您有一些原始数据,您可以通过识别原始数据中两种编码不同的字符并生成所需的序列来找到需要查找的序列(例如,如果我们发现ç出现在数据中,并且我们发现这会有序列ç,那么我们知道这是一个要寻找的序列
  • 请注意,如果我们有对应于mojikbake的System.Text.Encoding对象,则可以计算此类序列。例如,如果您在本应读取为UTF-8时读取为系统的默认编码,则可以使用:

    Encoding.Default.GetString(Encoding.UTF8.GetBytes(testString))
    
    例如:

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

    返回“ç”.

    问题出在哪里:存储字符串还是检索字符串?它们是否正确存储在数据库中?请尝试用当前代码的相关片段来回答此问题。数据库中的字符串已损坏。需要立即修复这些条目。这意味着它们未正确存储。请尝试缩小pr范围查看它们何时丢失的问题。DB存储unicode没有问题,我做了一个手动输入,工作正常。原本打算将字符串发送到DB的程序已经修复了问题。现在,我需要获取损坏的字符串,修复它们并将其重新发送到DB。必须自动检测损坏的字符串并将其重新发送到DB。您可以如果你在程序中记录错误,我只会得到一个直接可用的答案。