首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用LitJSON从JSON文件中提取UTF-8字符串,因为JsonData似乎没有转换?

如何使用LitJSON从JSON文件中提取UTF-8字符串,因为JsonData似乎没有转换?
EN

Stack Overflow用户
提问于 2017-07-28 23:01:04
回答 1查看 2.9K关注 0票数 1

我已经尝试过许多方法,使用LitJson在Unity中从JSON文件中提取一些字符串。

我已经对所有的转换进行了编码,尝试获取字节数组并将它们发送出去,但似乎没有任何东西工作。

我开始创建JsonData对象,并尝试运行以下测试:

代码语言:javascript
复制
public JsonData CreateJSONDataObject()
{
    Debug.Assert(pathName != null, "No JSON Data path name set. Please set before commencing read.");
    string jsonString = File.ReadAllText(Application.dataPath + pathName, System.Text.Encoding.UTF8);        
    JsonData jsonDataObject = JsonMapper.ToObject(jsonString);
    Debug.Log("Test compatibility: ë | " + jsonDataObject["Roots"][2]["name"]);
    return jsonDataObject;
}

我确保我的jsonString使用的是UTF-8,但是输出显示如下:

代码语言:javascript
复制
Test compatibility: ë | W�den

我尝试过许多其他方法,但由于这是为了确保在创建JsonData对象时正确编码,所以我无法想象自己做错了什么,因为我对JSON了解得不够。

提前谢谢你。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-29 05:15:39

当使用一种编码编写文本文件并使用另一种编码读取文本文件时,会发生这种类型的问题。我能够用以下程序重现您的问题,该程序将JSON序列化从等式中完全删除:

代码语言:javascript
复制
string file = @"c:\temp\test.txt";
string text = "Wöden";
File.WriteAllText(file, text, Encoding.Default));
string text2 = File.ReadAllText(file, Encoding.UTF8);
Debug.WriteLine(text2);

由于您正在使用UTF-8阅读,而且它不起作用,所以真正的问题是,最初使用了什么编码来编写文件?您应该使用相同的编码来读取它。我怀疑文件最初是使用Windows-1252iso-8859-1而不是UTF-8创建的。在读取文件时尝试使用其中之一,例如:

代码语言:javascript
复制
string jsonString = File.ReadAllText(Application.dataPath + pathName,
                                     Encoding.GetEncoding("Windows-1252"));

您在注释中说,您的JSON文件不是以编程方式创建的,而是“手工编写的”,这意味着您使用记事本或其他文本编辑器来创建该文件。如果是这样的话,那就解释了你是如何陷入这种情况的。保存文件时,应该可以选择编码。至少对于记事本来说,默认编码是"ANSI",这很可能映射到Windows1252(西欧),但取决于您的地区。例如,如果您在波罗的海地区,它将是Windows1257(波罗的海)。无论如何,"ANSI“是而不是 UTF-8。如果要以UTF-8编码保存文件,则必须具体选择该选项。无论您使用什么选项来保存文件,也就是您下次读取该文件所需的编码,无论是使用文本编辑器还是使用代码。使用错误的编码读取文件是导致损坏的原因。

若要更改文件的编码,首先必须使用与最初保存的文件相同的编码方式读取文件,然后可以使用不同的编码将其写回。您可以使用文本编辑器执行此操作,只需使用不同的编码重新保存文件,也可以通过编程方式这样做:

代码语言:javascript
复制
string text = File.ReadAllText(file, originalEncoding);
File.WriteAllText(file, text, newEncoding); 

关键是知道最初使用的是哪种编码,而其中的难点就在于此。对于遗留编码(如Windows12xx),无法判断,因为文件中没有标识它的标记。另一方面,Unicode编码(例如UTF-8,UTF-16)在文件开头写一个标记,称为BOM,或字节顺序标记,这些标记可以编程地检测到。这再加上Unicode编码可以表示所有字符的事实,这就是为什么它们比遗留编码更受欢迎的原因。

有关更多信息,我强烈建议您阅读每个程序员绝对、积极地需要了解编码和字符集才能处理文本。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45383518

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档