大家好,我是阿赵。
  这里来分享一下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转换成简体,然后再把转换后的结果和转换前的对比,如果两者不相等的,证明转换前的字符串里面就含有繁体中文了。
我不能这么做,是因为我的实际问题里面,并不止有繁体中文, 还有日文。有很多日文的字,看起来是汉字,但却和我们实际的汉字不一样,那些字转繁简体都是一样的,比如“呂”“蔵”之类,这就让问题变得复杂很多了。

03-13 02:26