1

我尝试了许多方法来使用 Unity 中的 LitJson 从 JSON 文件中提取一些字符串。

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

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

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,但是输出显示如下:

Test compatibility: ë | W�den

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

先感谢您。

4

1 回答 1

2

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

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. 阅读文件时尝试使用其中之一,例如:

string jsonString = File.ReadAllText(Application.dataPath + pathName,
                                     Encoding.GetEncoding("Windows-1252"));

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

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

string text = File.ReadAllText(file, originalEncoding);
File.WriteAllText(file, text, newEncoding); 

关键是知道最初使用的是哪种编码,这就是问题所在。对于旧式编码(例如 Windows-12xx),无法判断,因为文件中没有标识它的标记。另一方面,Unicode 编码(例如 UTF-8、UTF-16)确实会在文件的开头写出一个标记,称为 BOM 或字节顺序标记,可以通过编程方式检测到。再加上 Unicode 编码可以表示所有字符这一事实,这就是为什么它们比传统编码更受欢迎的原因。

有关更多信息,我强烈建议阅读每个程序员绝对、积极需要了解的关于使用文本的编码和字符集的知识。

于 2017-07-29T05:15:39.070 回答