代码之家  ›  专栏  ›  技术社区  ›  Arvin

jsonSerializer.Deserialize对c中的unicode字符无法正常工作#

  •  1
  • Arvin  · 技术社区  · 10 年前

    我想将包含unicode数据的JSON对象取消序列化为字符串数组。虽然JSON对象中的字符是英语,但它工作正常。但当我使用中文时,它不会。

    JavaScriptSerializer jsonSerializer = new JavaScriptSerializer();
    string[] SampleText = jsonSerializer.Deserialize<string[]>(HttpContext.GetGlobalResourceObject("Resource", "SampleText").ToString());
    

    当我在visual studio的即时窗口中运行这个时,英语的输出是这样的

    jsonSerializer.Deserialize<string[]>(HttpContext.GetGlobalResourceObject("Resource", "SampleText").ToString());
    {string[3]}        
        [0]: "Size"
        [1]: "Name"
        [2]: "Type"
    

    但对于中国人来说,有一个例外

    base {System.SystemException}: {"Invalid JSON primitive: ."}
    Message: "Invalid JSON primitive: ."
    ParamName: null
    

    中英文资源文件的价值

    ["Size","Name","Type"]
    [“大小”,“姓名”,“類型”]
    
    2 回复  |  直到 10 年前
        1
  •  1
  •   Panagiotis Kanavos    10 年前

    编辑: 我刚刚注意到,日语文本被聪明的引号包围 “ ” 而不是实际报价 " 。将智能引号替换为简单引号。我所知道的语言没有使用智能引号作为文本分隔符,它们被视为内容。文本还使用非逗号字符 , (十六进制ff0c)而不是逗号。

    .NET中的字符串是Unicode。无法创建 -Unicode字符串。

    只有当您尝试读取非Unicode内容(如特定代码页中编码的文件)时,才会出现问题,就像它是Unicode文件一样。OS(和.NET)将使用系统区域设置读取非unicode文件,这可能会导致数据混乱。解决方案是使用Unicode编码保存文件,或者如果文件的编码与系统区域设置不同,则显式指定文件的编码。

    在您的情况下,资源文件最有可能 另存为Unicode(或UTF8)文件。以前版本的Visual Studio默认情况下使用系统的语言环境保存文件(包括网页),这对非美国开发人员造成了一些非常有趣的问题。

    检查返回的字符串 HttpContext.GetGlobalResourceObject("Resource", "SampleText").ToString() 。内容可能会乱码,这意味着原始字符串是 另存为Unicode。

    解决方案可能与将资源文件转换为Unicode一样简单。