苏飞论坛

标题: C#中文和UNICODE字符转换方法 [打印本页]

作者: 站长苏飞    时间: 2012-11-24 18:30
标题: C#中文和UNICODE字符转换方法
                                C#中文和UNICODE字符转换方法

在线直接转换工具    http://tool.sufeinet.com/Code/ChineseUnicode.aspx

这个方式其实很多见,特别是使用Json的时候用的比较多,
其实也很简单主要是使用了ToString("x")方法
直接看代码吧
[C#] 纯文本查看 复制代码
string str = "大家好我是苏飞";
            string outStr = "";
            if (!string.IsNullOrEmpty(str))
            {               
                for (int i = 0; i < str.Length; i++)
                {
                    //将中文字符转为10进制整数,然后转为16进制unicode字符
                    outStr += "\\u" + ((int)str).ToString("x");
                }
            }

下面方法是怎么样把UNICODE数据转成中文
就比如说像下面这样的数据吧
\u8c01\u80fd\u591f\u7ed9\u6211\u98ce\u9669\u6295\u8d44\u54e6!\u6211\u60f3\u501f\u5341\u4e07\u529e\u4e00\u4e2a\u517b\u6b96\u5382\u3002\u6211\u53ef\u662f\u6709\u5bb6\u5ead\u62c5\u4fdd\u7684\u54e6!#\u4e0a\u7f51\u7231\u901b\u4ec0\u4e48
这里主要是使用的Parse方法
看具体实现吧
[C#] 纯文本查看 复制代码
private void Form1_Load(object sender, EventArgs e)
        {
            string str = @"\u8c01\u80fd\u591f";

            str = UniconToString(str);
        }
        /// <summary>
        /// 将Unicon字符串转成汉字String
        /// </summary>
        /// <param name="str">Unicon字符串</param>
        /// <returns>汉字字符串</returns>
        public string UniconToString(string str)
        {
            string outStr = "";
            if (!string.IsNullOrEmpty(str))
            {
                string[] strlist = str.Replace("\\", "").Split('u');
                try
                {
                    for (int i = 1; i < strlist.Length; i++)
                    {
                        //将unicode字符转为10进制整数,然后转为char中文字符
                        outStr += (char)int.Parse(strlist, System.Globalization.NumberStyles.HexNumber);
                    }
                }
                catch (FormatException ex)
                {
                    outStr = ex.Message;
                }
            }
            return outStr;
        }




作者: a425107265    时间: 2013-4-24 18:02
受教了,学习中……     sofa

作者: try    时间: 2013-6-24 02:50
网页上有其他字符呢?   提示输入的字符串不正确
作者: 站长苏飞    时间: 2013-6-24 13:10
try 发表于 2013-6-24 02:50
网页上有其他字符呢?   提示输入的字符串不正确

那是肯定的,这只能转Unicode字符串

作者: 钢军大天    时间: 2013-6-27 17:58
楼主很棒!
作者: 夜雨蒙蒙    时间: 2014-3-12 01:12
受教了,学习中……
作者: 站长苏飞    时间: 2014-4-8 08:21
发条陈 发表于 2014-4-7 20:45
贡献给LZ
[mw_shl_code=csharp,true]public string test(string data)
{

这个方法很好
作者: sandy1231    时间: 2014-7-15 14:56
发条陈 发表于 2014-4-7 20:45
贡献给LZ
[mw_shl_code=csharp,true]public string test(string data)
{

不知为什么这方法好奇怪,有时行有时不行,调试的时候发现代码还没跑进去,数据都已经转换好中文了
作者: sandy1231    时间: 2014-7-15 15:10
站长苏飞 发表于 2014-4-8 08:21
这个方法很好

这个方法好像不行吧,我测试过
如果是这样写
string str="\u8c01\u80fd";
string result=test(str);
其实第一行定义str的时候就已经转换好了,把第二行删了一样可以。
而如果写成:
string str=Resource1.String1;
string result=test(str);
这样就不行了

这方法是无效的

作者: 站长苏飞    时间: 2014-7-15 15:13
sandy1231 发表于 2014-7-15 15:10
这个方法好像不行吧,我测试过
如果是这样写
string str="\u8c01\u80fd";

把那个第二行删除也可以啊。
站长苏飞 发表于 2014-4-8 08:21
这个方法很好


string str="\u8c01\u80fd";
string result=test(str);
你这样得不到值吗?
作者: sandy1231    时间: 2014-7-15 15:19
string str="\u8c01\u80fd";
textbox1.test=str;
这样就可以获取到值了
作者: sandy1231    时间: 2014-7-15 15:20
站长苏飞 发表于 2014-7-15 15:13
把那个第二行删除也可以啊。
站长苏飞 发表于 2014-4-8 08:21
这个方法很好


string str="\u8c01\u80fd";
textbox1.test=str;
这样就可以获取到值了
作者: 站长苏飞    时间: 2014-7-15 15:23
sandy1231 发表于 2014-7-15 15:20
string str="\u8c01\u80fd";
textbox1.test=str;
这样就可以获取到值了

人家提供的就是一个方法,你只要调用就行了,没必要定义那么多东西
你现在是根据就没有使用别人的方法。你得到的是汉字吗?
作者: sandy1231    时间: 2014-7-15 15:33
站长苏飞 发表于 2014-7-15 15:23
人家提供的就是一个方法,你只要调用就行了,没必要定义那么多东西
你现在是根据就没有使用别人的方法。 ...

我刚才测试了好久了
如果是直接定义的unicode编码,比如
string str="\u8C01\u80FD";
这样str的值直接就是汉字了,编译器已经自动转换好了。
所以这时候你再去调用他的方法,就为以为是这个方法转换成功的。这些调试一下就看得很清楚

他方法的参数,要是直接把Resource1.String1传过去,转换没效果。
要是直接传"\u8C01\u80FD",编译器已经自动转换好了。
他的方法有没效果调试下就知道了

作者: 站长苏飞    时间: 2014-7-15 15:37
sandy1231 发表于 2014-7-15 15:33
我刚才测试了好久了
如果是直接定义的unicode编码,比如
string str="\u8C01\u80FD";

好吧服了,我不再说什么?以后你会懂的。
作者: sandy1231    时间: 2014-7-15 15:47
站长苏飞 发表于 2014-7-15 15:37
好吧服了,我不再说什么?以后你会懂的。

string str="\u8C01\u80FD";
MessageBox.Show(str);
上面这段得出中文结果

string str=Resource1.String1;
MessageBox.Show(str);
上面这段得到的不是中文结果

MessageBox.Show(test(Resource1.String1));
上面这段得到的也不是中文结果

我说的是7楼的方法,不是说你的方法。
作者: 站长苏飞    时间: 2014-7-15 15:49
sandy1231 发表于 2014-7-15 15:47
string str="\u8C01\u80FD";
MessageBox.Show(str);
上面这段得出中文结果

Resource1.String1你这是什么啊,具体内容是什么只查Unicode字符肯定可以转化的
作者: sandy1231    时间: 2014-7-15 15:50
站长苏飞 发表于 2014-7-15 15:49
Resource1.String1你这是什么啊,具体内容是什么只查Unicode字符肯定可以转化的

Resource1.String1是资源文件里的字符串,里面是\u8C01\u80FD
作者: 站长苏飞    时间: 2014-7-15 15:51
sandy1231 发表于 2014-7-15 15:50
Resource1.String1是资源文件里的字符串,里面是\u8C01\u80FD

那不应该吧,你取出来看看格式对不对。string str="\u8C01\u80FD"; 这个都可以,如果你的得到是正常的字符串不应该不行的,
你也取到Str里看看是什么应该就明白为什么不行了。
作者: sandy1231    时间: 2014-7-15 16:02
站长苏飞 发表于 2014-7-15 15:51
那不应该吧,你取出来看看格式对不对。string str="\u8C01\u80FD"; 这个都可以,如果你的得到是正常的字 ...

格式是没有问题的,
string str="\u8C01\u80FD";
MessageBox.Show(str);
肯定可以,因为这是编译器转换的,调试的时候到了str那,显示的就是中文了。

至于我为什么要把编码写到Resource1.String1资源文件里,这是测试而已。
正常来说获取一个值肯定是动态的
比如string str= 变量
而不是string str="\u8C01\u80FD" 这样写死的
作者: 站长苏飞    时间: 2014-7-15 16:13
sandy1231 发表于 2014-7-15 16:02
格式是没有问题的,
string str="\u8C01\u80FD";
MessageBox.Show(str);

这和是不是变量没有关系,只要你的格式正确肯定是对的,只有一种情况就是你的格式不对,你打印出来看一下不行吧,说这么多不如打出来看看,我测试过这个方法是可以的,肯定和变量不变量的没有关系的。
作者: sandy1231    时间: 2014-7-15 16:27
站长苏飞 发表于 2014-7-15 16:13
这和是不是变量没有关系,只要你的格式正确肯定是对的,只有一种情况就是你的格式不对,你打印出来看一下 ...

那麻烦把你的测试的代码发给我吧,这个可以说明问题了
作者: 站长苏飞    时间: 2014-7-15 16:36
sandy1231 发表于 2014-7-15 16:27
那麻烦把你的测试的代码发给我吧,这个可以说明问题了

这就是一个方法,还要什么测试代码,现在最重要是不知道你传的数据是什么,你光说不行,这其实是不叫理啊,谁知道你传是什么,说不定是乱写的一堆东西,呵呵。话虽说有点过了,但是道理就是这样的。我们的源码都在这里放着,调用方法就是一句话
string str="\u8c01\u80fd";
string result=test(str);
result就是想要的结果。

而你的数据不清楚是什么,所以现在封闭的地方是在你的数据而不是我的例子,我的例子就是上面的代码,肯定可以,
str就是变量。任何Unicode字符都可以转化。
作者: sandy1231    时间: 2014-7-15 17:27
站长苏飞 发表于 2014-7-15 16:36
这就是一个方法,还要什么测试代码,现在最重要是不知道你传的数据是什么,你光说不行,这其实是不叫理啊 ...

string str="\u8c01\u80fd";
string result=test(str);
这句我都说很多次了 肯定可以的,我测试了N次,就算不要test(str);也是可以出来中文的
我的格式怎么可能会错呢,就一句"\u8c01\u80fd",怎么会错
而且你的变量是写死的,编译器早就转换好了
难道实际开发当中 ,凡是变量都写成string str="\u8c01\u80fd"; 这样吗?都要写死吗
要验证方法行不行,只要传一个动态的变量就可以,你都没试过就说不行了
作者: sandy1231    时间: 2014-7-15 17:37
站长苏飞 发表于 2014-7-15 16:36
这就是一个方法,还要什么测试代码,现在最重要是不知道你传的数据是什么,你光说不行,这其实是不叫理啊 ...

这三张图说明问题了吧
(, 下载次数: 103)