大家好,我是阿赵。
这里来分享一下Unity转换字符串繁简体中文的问题。
一、需求
由于某种不可描述的历史原因,导致了项目里面的界面上有些地方存在着多种语言。我需要做的事情,是遍历一堆已经做好的Unity的UGUI界面,然后把包含了繁体中文的文本,批量修改成简体中文。
二、在Unity进行中文繁简体转换
C#本身并没有直接的字符串处理方法可以直接转换中文繁简体转换,所以一般都是需要借助其他库的方法。比如VB或者kernel32。下面这个转换的方法我是从网上找的,使用了kernel32的LCMapString函数来转换中文繁简体。
using System;
using System.Runtime.InteropServices;
public class ChineseConvertTool
{
private const int LOCALE_SYSTEM_DEFAULT = 0x0800;
private const int LCMAP_SIMPLIFIED_CHINESE = 0x02000000;
private const int LCMAP_TRADITIONAL_CHINESE = 0x04000000;
[DllImport("kernel32", CharSet = CharSet.Auto, SetLastError = true)]
private static extern int LCMapString(int Locale, int dwMapFlags, string lpSrcStr, int cchSrc, [Out] string lpDestStr, int cchDest);
/// <summary>
/// 把字符串转换到繁体中文
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
static public string ToTraditional(string str)
{
String target = new String(' ', str.Length);
int ret = LCMapString(LOCALE_SYSTEM_DEFAULT, LCMAP_TRADITIONAL_CHINESE, str, str.Length, target, str.Length);
return target;
}
/// <summary>
/// 把字符串转换到简体中文
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
static public string ToSimplified(string str)
{
String target = new String(' ', str.Length);
int ret = LCMapString(LOCALE_SYSTEM_DEFAULT, LCMAP_SIMPLIFIED_CHINESE, str, str.Length, target, str.Length);
return target;
}
}
三、匹配繁简体中文字符
匹配繁简体中文字符串的问题,比较复杂,很难直接的从编码范围就能简单的用正则匹配,所以我这里想了一个办法,先通过gb2312编码把字符转换成byte[],判断长度等于2的,有可能是中文。然后在这个基础上,判断高低位字节范围,得出简体中文部分。剩下的部分,用正则判断是否属于中文字符范围,如果是,则是繁体中文,剩下的,就是全角字符,比如中文的括号、句号之类。
System.Text.Encoding gb = System.Text.Encoding.GetEncoding("gb2312");
for(int i = 0;i<input.Length;i++)
{
char ch = input[i];
string str = ch.ToString();
byte[] bs = gb.GetBytes(str);
if(bs.Length ==2 )
{
if(bs[0]>=0xB0&&bs[0]<=0xF7&&bs[1]>=0xA1&&bs[1]<=0xFE)
{
//简体中文
}
else
{
if (System.Text.RegularExpressions.Regex.IsMatch(str, @"[\u4e00-\u9fa5]") ==true)
{
//繁体中文
}
else
{
//全角符号
}
}
}
}
实际上,如果我们的字符串里面能确定只有繁简体中文需要转换,是有更简单的办法的。每个字符串,用上面转换的方法,先ToSimplified转换成简体,然后再把转换后的结果和转换前的对比,如果两者不相等的,证明转换前的字符串里面就含有繁体中文了。
我不能这么做,是因为我的实际问题里面,并不止有繁体中文, 还有日文。有很多日文的字,看起来是汉字,但却和我们实际的汉字不一样,那些字转繁简体都是一样的,比如“呂”“蔵”之类,这就让问题变得复杂很多了。