有个任务要做多语言切换功能,然后需要用到json资源包,参数对应显示的数据,一个简体资源包一个繁体的,由于中文会乱码,需要对显示的数据进行unicode编码,UTF-8也可以。手动录入的话太麻烦了,既要来回切换简繁输入,又要在线对数据进行编码,再复制粘贴到json文件中,工作量太大而且一直复制粘贴太傻逼了,所以就考虑通过写个窗体小程序实现。
想要的原始数据是参数和对应简体的json数据格式的txt文件。
格式如下:
{
"query": "查询",
"url": "地址",
"page": "页码",
"address": {
"street": "科技园路.",
"city": "江苏苏州",
"country": "中国"
}
}
想要的输出是两个转换后的txt文件,格式如下:
{
" query": "\u67e5\u8be2",
" url": "\u5730\u5740",
" page": "\u9875\u7801",
" address": {
" street": "\u79d1\u6280\u56ed\u8def\u002e",
" city": "\u6c5f\u82cf\u82cf\u5dde",
" country": "\u4e2d\u56fd"
}
}
用到的方法总结:
一、C# winform写入和读取TXT文件
string str;
str=this.textBox1.Text;
StreamWriter sw = new StreamWriter(Application.StartupPath +"\\txtwriter.txt", false);
sw.WriteLine(str);
sw.Close();//写入
string str;
StreamReader sr = new StreamReader(Application.StartupPath +"\\txtreader.txt", false);
str = sr.ReadLine().ToString();
sr.Close();
this.textBox1.Text = str;///读取
二、简繁体切换
添加引用Microsoft.VisualBasic
string strSimple = Microsoft.VisualBasic.Strings.StrConv(strTraditional, VbStrConv.SimplifiedChinese, 0);
string strTraditional = Microsoft.VisualBasic.Strings.StrConv(strSimple, Microsoft.VisualBasic.VbStrConv.TraditionalChinese, 0);
三、json对象的转换及拼接
添加引用Newtonsoft.Json
JObject jo = (JObject)JsonConvert.DeserializeObject(str);
foreach (var a in jo)
{
if (!string.IsNullOrEmpty(simpleStr))
{
simpleStr += ",";
diffStr += ",";
}
else
{
simpleStr += "{";
diffStr += "{";
}
simpleStr += "\" " + a.Key + "\":";
diffStr += "\" " + a.Key + "\":";
if (a.Value.HasValues)
{
simpleStr += "{";
diffStr += "{";
bool isfirst = true;
JObject childJo = (JObject)JsonConvert.DeserializeObject(a.Value.ToString());
foreach (var b in childJo)
{
if (!isfirst)
{
simpleStr += ",";
diffStr += ",";
}
else
{
isfirst = false;
}
simpleStr += "\" " + b.Key + "\":";
diffStr += "\" " + b.Key + "\":";
simpleStr += "\"" + String2Unicode(b.Value.ToString()) + "\"";
diffStr += "\"" + String2Unicode(Microsoft.VisualBasic.Strings.StrConv(b.Value.ToString(), Microsoft.VisualBasic.VbStrConv.TraditionalChinese, 0)) + "\"";
}
simpleStr += "}";
diffStr += "}";
}
else
{
simpleStr += "\"" + String2Unicode(a.Value.ToString()) + "\"";
diffStr += "\"" + String2Unicode(Microsoft.VisualBasic.Strings.StrConv(a.Value.ToString(), Microsoft.VisualBasic.VbStrConv.TraditionalChinese, 0)) + "\"";
}
}
simpleStr += "}";
diffStr += "}";
四、unicode编码
using System.Text.RegularExpressions;
/// <summary>
/// 字符串转Unicode
/// </summary>
/// <param name="source">源字符串</param>
/// <returns>Unicode编码后的字符串</returns>
internal static string String2Unicode(string source)
{
var bytes = Encoding.Unicode.GetBytes(source);
var stringBuilder = new StringBuilder();
for (var i = 0; i < bytes.Length; i += 2)
{
stringBuilder.AppendFormat("\\u{0}{1}", bytes[i + 1].ToString("x").PadLeft(2, '0'), bytes[i].ToString("x").PadLeft(2, '0'));
}
return stringBuilder.ToString();
}
/// <summary>
/// Unicode转字符串
/// </summary>
/// <param name="source">经过Unicode编码的字符串</param>
/// <returns>正常字符串</returns>
internal static string Unicode2String(string source)
{
return new Regex(@"\\u([0-9A-F]{4})", RegexOptions.IgnoreCase | RegexOptions.Compiled).Replace(source, x => Convert.ToChar(Convert.ToUInt16(x.Result("$1"), 16)).ToString());
}
五、过程中出现的错误
读取txt文件时中文乱码,StreamReader sR = new StreamReader(filePath, System.Text.Encoding.Default)
采用默认编码或者Encoding.GetEncoding("gb2312")可解决问题
json里面value还有数据的时候需要对里面的再进行反序列化成对象进行处理,不能直接处理。
最后就是犯了很多细节上的小问题,另外很多知识点都不熟悉了
最后说一下多语言切换用到的资源包不要这样弄,因为数据的key和value都很难看懂,最好的办法是在json文件保存的时候编码给设置为unicode编码或UTF-8编码,这样就不会出现乱码了,而且key值就可以设置为中文,比较容易看懂