【发布时间】:2020-09-16 19:36:28
【问题描述】:
从昨天开始,我在我的一个工具中显示俄语文本时遇到了问题。
我正在使用以下代码,它显示了项目的名称:
public static string LocalizedName(LocalizedNames localizedNames, string currentLanguage = null, string alternativeName = "NO_ITEM_NAME")
{
if (localizedNames == null)
return alternativeName;
if (string.IsNullOrEmpty(currentLanguage))
currentLanguage = LanguageController.CurrentCultureInfo.TextInfo.CultureName.ToUpper();
switch (FrequentlyValues.GameLanguages.FirstOrDefault(x => string.Equals(x.Value, currentLanguage, StringComparison.CurrentCultureIgnoreCase)).Key)
{
case GameLanguage.UnitedStates:
return Encoding.UTF8.GetString(Encoding.Default.GetBytes(localizedNames.EnUs ?? alternativeName));
case GameLanguage.Germany:
return Encoding.UTF8.GetString(Encoding.Default.GetBytes(localizedNames.DeDe ?? alternativeName));
case GameLanguage.Russia:
return Encoding.UTF8.GetString(Encoding.Default.GetBytes(localizedNames.RuRu ?? alternativeName));
case GameLanguage.Poland:
return Encoding.UTF8.GetString(Encoding.Default.GetBytes(localizedNames.PlPl ?? alternativeName));
case GameLanguage.Brazil:
return Encoding.UTF8.GetString(Encoding.Default.GetBytes(localizedNames.PtBr ?? alternativeName));
case GameLanguage.France:
return Encoding.UTF8.GetString(Encoding.Default.GetBytes(localizedNames.FrFr ?? alternativeName));
case GameLanguage.Spain:
return Encoding.UTF8.GetString(Encoding.Default.GetBytes(localizedNames.EsEs ?? alternativeName));
case GameLanguage.Chinese:
return Encoding.UTF8.GetString(Encoding.Default.GetBytes(localizedNames.ZhCn ?? alternativeName));
default:
return alternativeName;
}
}
这里是该工具的链接,用于测试它:https://github.com/Triky313/AlbionOnline-StatisticsAnalysis
对我来说,所有语言都正确显示(德国),但俄罗斯的其他人只能看到错误文本。
编辑: 这里是项目列表文件的一部分:
` "LocalizedNames": {
"EN-US": "Hideout Construction Kit",
"DE-DE": "Unterschlupf-Baukasten",
"FR-FR": "Kit de construction de repaire",
"RU-RU": "Ðабор Ð´Ð»Ñ Ð¿Ð¾Ñтройки убежища",
"PL-PL": "Zestaw do budowy Kryjówki",
"ES-ES": "Kit de construcción de Escondites",
"PT-BR": "Kit de Construção de Esconderijo",
"ZH-CN": "è—èº«åœ°å ¡å»ºç‘工具包",
"KO-KR": "ì€ì‹ 처 건설키트" }, `
文件将从这个网址下载:
https://raw.githubusercontent.com/broderickhyman/ao-bin-dumps/master/formatted/items.json
有人知道我该如何解决这个问题吗?
【问题讨论】:
-
由于在某些元素中俄语文本显示没有问题,因此似乎是控件中的问题没有正确显示文本。
-
你应该得到这个包的来源,看看里面,Имя栏是如何实现的。
-
Encoding.UTF8.GetString(Encoding.Default.GetBytes(…))没有任何意义,因为这意味着您有一个 UTF-16 Unicode 字符串(因为 .NET 将其字符串存储在 UTF-16 中),应将其转换为计算机的 ANSI 编码(这就是 Encoding.Default 是)字节,然后应将其解码为 UTF-8。这是行不通的,或者更确切地说,它只适用于 UTF-8 的公共子集和你的 ANSI 编码,它们是由英文字母和数字组成的低 128 个代码点。所以难怪俄语字符会产生乱码输出——中文也是如此。 -
LocalizedNames已经以错误方式填充这些问题的根源。您需要从最初获取这些字符串的源头为每种语言提供正确的编码。所以请展示一下,你在哪里实际分离了你放入 LocalizedNames 的字符串。 -
编辑帖子并添加源文件。
标签: c# .net wpf utf-8 localization