美文网首页
解决java和C#编码不一样,TCP传输中文无法识别的问题

解决java和C#编码不一样,TCP传输中文无法识别的问题

作者: 我的小猫不见了 | 来源:发表于2020-03-31 07:32 被阅读0次

感谢:https://www.cnblogs.com/austinspark-jessylu/p/6873198.html
感谢:https://blog.csdn.net/chengmodelong/article/details/42870485
感谢:http://blog.sina.com.cn/s/blog_980b43cf0102xdd9.html

Question: 问题来源

在调试Java端Mina服务器 , 用TCP连接的时候 , 由于编码问题 , 遇到中文服务器就无法解析 , 解决办法 , 在C#端采用中文转Unicode , Mina端服务器采用Unicode解析中文就好了.

这是Java里面Unicode和汉字互相转换

package com.sun;

public class Snippet {
    public static void main(String[] args) {
        String cn = "你";
        System.out.println(cnToUnicode(cn));
        // 字符串 : \u5f00\u59cb\u4efb\u52a1 ,由于 \ 在java里是转义字符,要写出下面这种形式
        String unicode = "\\u4f60";
        System.out.println(unicodeToCn(unicode));
    }
    
    private static String unicodeToCn(String unicode) {
        /** 以 \ u 分割,因为java注释也能识别unicode,因此中间加了一个空格*/
        String[] strs = unicode.split("\\\\u");
        String returnStr = "";
        // 由于unicode字符串以 \ u 开头,因此分割出的第一个字符是""。
        for (int i = 1; i < strs.length; i++) {
          returnStr += (char) Integer.valueOf(strs[i], 16).intValue();
        }
        return returnStr;
    }
    
    private static String cnToUnicode(String cn) {
        char[] chars = cn.toCharArray();
        String returnStr = "";
        for (int i = 0; i < chars.length; i++) {
          returnStr += "\\u" + Integer.toString(chars[i], 16);
        }
        return returnStr;
    }
}

这是C#端的汉字与 Unicode互相转换.

/// <summary>
/// <summary>
/// 字符串转Unicode
/// </summary>
/// <param name="source">源字符串</param>
/// <returns>Unicode编码后的字符串</returns>
public static string String2Unicode(string source)
{
    byte[] bytes = Encoding.Unicode.GetBytes(source);
    StringBuilder stringBuilder = new StringBuilder();
    for (int 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>
public static string Unicode2String(string source)
{
    return new Regex(@"\\u([0-9A-F]{4})", RegexOptions.IgnoreCase | RegexOptions.Compiled).Replace(
                 source, x => string.Empty + Convert.ToChar(Convert.ToUInt16(x.Result("$1"), 16)));
}

这是我在服务器端用的接收用户发送的消息,从Unicode转成汉字用的一个方法,


image.png
image.png

相关文章

网友评论

      本文标题:解决java和C#编码不一样,TCP传输中文无法识别的问题

      本文链接:https://www.haomeiwen.com/subject/kcyiuhtx.html