Unicode/汉字互转实现

发布时间 2023-11-09 16:00:30作者: 乐 乐——1128
  首先,什么是Unicode,百科知识:Unicode(统一码、万国码、单一码)是计算机科学领域里的一项业界标准,包括字符集、编码方案等;Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。
 
    balabala一堆,其实可以举个例子简单的理解一下:秦国一统六国后,统一货币,度量衡等,创造一个统一的标准,所有秦的领土范围内都使用这个标准,标准统一后,各种杂七杂八混乱的问题也就随着解决了,然后走向人生巅峰,迎娶xxx云云。 。。
    Unicode也一样,它把所有的语言(中文、英文、韩文...)都纳入到一套编码中,统一所有的文字编码,这样就解决了中国用中国定制的编码,日本用日本定制的编码....这种混乱的现象,这样就不会出现乱码的现象了。Unicode中一般用两个字节(16bit)表示一个字符,就算原有的英文编码也从单字节变成了双字节,但是影响不大,把高位字节置0就完事了

  Unicode 是为了解决传统的字符编码方案的局限而产生的,例如ISO 8859所定义的字符虽然在不同的国家中广泛地使用,可是在不同国家间却经常出现不兼容的情况。很多传统的编码方式都有一个共同的问题,即容许电脑处理双语环境(通常使用拉丁字母以及其本地语言),但却无法同时支持多语言环境(指可同时处理多种语言混合的情况)。
Unicode 编码包含了不同写法的字,如“ɑ/a”、“户/户/戸”。然而在汉字方面引起了一字多形的认定争议(详见中日韩统一表意文字主题)。
在文字处理方面,统一码为每一个字符而非字形定义唯一的代码(即一个整数)。换句话说,统一码以一种抽象的方式(即数字)来处理字符,并将视觉上的演绎工作(例如字体大小、外观形状、字体形态、文体等)留给其他软件来处理,例如网页浏览器或是文字处理器。
  几乎所有电脑系统都支持基本拉丁字母,并各自支持不同的其他编码方式。Unicode为了和它们相互兼容,其首256字符保留给ISO 8859-1所定义的字符,使既有的西欧语系文字的转换不需特别考量;并且把大量相同的字符重复编到不同的字符码中去,使得旧有纷杂的编码方式得以和Unicode编码间互相直接转换,而不会丢失任何信息。举例来说,全角格式区段包含了主要的拉丁字母的全角格式,在中文、日文、以及韩文字形当中,这些字符以全角的方式来呈现,而不以常见的半角形式显示,这对竖排文字和等宽排列文字有重要作用。
  在表示一个Unicode的字符时,通常会用“U+”然后紧接着一组十六进制的数字来表示这一个字符。在基本多文种平面(英文为 Basic Multilingual Plane,简写 BMP。它又简称为“零号平面”, plane 0)里的所有字符,要用四位十六进制数(例如U+4AE0,共支持六万多个字符);在零号平面以外的字符则需要使用五位或六位十六进制数了。旧版的Unicode标准使用相近的标记方法,但却有些微的差异:在Unicode 3.0里使用“U-”然后紧接着八位数,而“U+”则必须随后紧接着四位数。
  
//汉字转Unicode编码(ASCII)
private string StringToUnicode(string srcText)
{
 string dst = "";
 char[] src = srcText.ToCharArray();
 for (int i = 0; i < src.Length; i++)
 {
  byte[] bytes = Encoding.Unicode.GetBytes(src[i].ToString());
  string str = @"\u" + bytes[1].ToString("X2") + bytes[0].ToString("X2");
  dst += str;
 }
 return dst;
}
//TO汉字 srcText为去除\u之后的4位字符
using System.Globalization;
private string ToCN(string srcText)
{
 string str = srcText;
 byte[] bytes = new byte[2];
 bytes[1] = byte.Parse(int.Parse(str.Substring(0, 2), NumberStyles.HexNumber).ToString());
 bytes[0] = byte.Parse(int.Parse(str.Substring(2), NumberStyles.HexNumber).ToString());
 return Encoding.Unicode.GetString(bytes);
}
================================================================
public static string ConvertToGB(string unicodeString) 
{ 
 string[] strArray = unicodeString.Split(new string[] { @"u" }, StringSplitOptions.None); 
 string result = string.Empty; 
 for (int i = 0; i < strArray.Length; i++) 
 { 
  if (strArray[i].Trim() == "" || strArray[i].Length < 2 || strArray.Length <= 1) 
  { 
   result += i == 0 ? strArray[i] : @"u" + strArray[i]; continue; 
  }  
  for (int j = strArray[i].Length > 4 ? 4 : strArray[i].Length; j >= 2; j--) 
  { 
   try 
   { 
    result += char.ConvertFromUtf32(Convert.ToInt32(strArray[i].Substring(0, j), 16)) + strArray[i].Substring(j); 
    break; 
   } 
   catch 
   { 
    continue; 
   } 
  } 
 } return result; 
} 
public static string ConvertToUnicode(string strGB) 
{ 
 char[] chs = strGB.ToCharArray(); string result = string.Empty; foreach (char c in chs) 
 { 
  result += @"u" + char.ConvertToUtf32(c.ToString(), 0).ToString("x"); 
 } 
 return result; 
}
/// <summary>
 /// 字符串转为UniCode码字符串
 /// </summary>
 /// <param name="s"></param>
 /// <returns></returns>
 public static string StringToUnicode(string s)
 {
  char[] charbuffers = s.ToCharArray();
  byte[] buffer;
  StringBuilder sb = new StringBuilder();
  for (int i = 0; i < charbuffers.Length; i++)
  {
   buffer = System.Text.Encoding.Unicode.GetBytes(charbuffers[i].ToString());
   sb.Append(String.Format("//u{0:X2}{1:X2}", buffer[1], buffer[0]));
  }
  return sb.ToString();
 }
 /// <summary>
 /// Unicode字符串转为正常字符串
 /// </summary>
 /// <param name="srcText"></param>
 /// <returns></returns>
 public static string UnicodeToString(string srcText)
 {
  string dst = "";
  string src = srcText;
  int len = srcText.Length / 6;
  for (int i = 0; i <= len - 1; i++)
  {
   string str = "";
   str = src.Substring(0, 6).Substring(2);
   src = src.Substring(6);
   byte[] bytes = new byte[2];
   bytes[1] = byte.Parse(int.Parse(str.Substring(0, 2), NumberStyles.HexNumber).ToString());
   bytes[0] = byte.Parse(int.Parse(str.Substring(2, 2), NumberStyles.HexNumber).ToString());
   dst += Encoding.Unicode.GetString(bytes);
  }
  return dst;
 }

{"Tilte": "\u535a\u5ba2\u56ed", "Href": "http://www.cnblogs.com"}

经常遇到这样内容的json字符串,原来是把其中的汉字做了Unicode编码转换。

Unicode编码:

  将汉字进行UNICODE编码,如:“王”编码后就成了“\王”,UNICODE字符以\u开始,后面有4个数字或者字母,所有字符都是16进制的数字,每两位表示的256以内的一个数字。而一个汉字是由两个字符组成,于是就很容易理解了,“738b”是两个字符,分别是“73”“8b”。但是在将 UNICODE字符编码的内容转换为汉字的时候,字符是从后面向前处理的,所以,需要把字符按照顺序“8b”“73”进行组合得到汉字。

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)));
}