首页 > 其他分享 >Unicode/汉字互转实现

Unicode/汉字互转实现

时间:2023-11-09 16:00:53浏览次数:38  
标签:字符 string 编码 bytes 汉字 ToString Unicode 互转

  首先,什么是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)));
}

 

标签:字符,string,编码,bytes,汉字,ToString,Unicode,互转
From: https://www.cnblogs.com/leon1128/p/17821886.html

相关文章

  • 【Python&GIS】基于Python实现栅格转面、面转栅格(栅格、矢量互转)
    ​    各位好,我又来水文章了。最近因为同事在做生态服务相关的项目,需要对矢量数据进行操作,然后我就查了查相关资料,今天就和大家分享一下如何使用Python的GDAL库实现栅格转要素、要素转栅格(栅格、矢量互相转换)。其实我之前已经分享过栅格转面和计算要素面积的代码,大家感......
  • 怎么在word里去掉所有的汉字
    1按“ctrl+F”键,在查找内容中输入 [!^1-^127]2高级选项,使用通配符3全部替换  ......
  • python之unicode和encode
    Python中有两种默认的字符串:str和unicode。在Python中一定要注意区分“Unicode字符串”和“unicode对象”的区别。后面所有的“unicode字符串”指的都是python里的“unicode对象”。事实上在Python中并没有“Unicode字符串”这样的东西,只有“unicode”对象。一个传统意义上的un......
  • 字符与数字的相互转换C++
    一、字符转数字char类型字符转换为数字,其实是转换为ASCII码值有两种方式:1.强制类型转换,结果为对应的ASCII码值charv1='a';charv2='z';charv3='1';charv4='9';intnum1=(int)v1;intnum2=(int)v2;intnum3=(int)v3;intnum4=(int)v4;printf......
  • Linux 下 使用点阵在LCD上显示汉字,字符
    @TOC前言这篇文章主要讲一下如何在LCD上使用点阵显示汉字,字符,修改颜色及效果展示。其中包含了几个核心函数,我们需要了解。一、显示字符1.获取点阵:各个字符对应的点阵都保存在一个数组里,大家可以打开font_8x16.c中得到点阵。(不同的点阵对应不同的代码,这里我使用的是8x16的点......
  • 一种pug与html相互转换的工具
        有时候看pug很不方便,这个语言虽然简洁,但可读性与维护性较差,所以需要进行转换,这个是win工具,比较方便。         这个工具的下载地址如下:    解压后如下:   运行后输入自己的pug代码右边,这样相应的html代码也在左边显示,比较也方便。  ......
  • STM32 OLED显示字符汉字
    本文代码使用HAL库。@TOC前言OLED屏幕是一种高对比度、高亮度、低功耗、灵活可弯曲的显示技术。在电子产品中,OLED屏幕通常用于显示各种文本、图标、图像等内容。本篇文章将介绍使用I2C接口在OLED屏幕上显示字符,汉字。一、OLED接线:我使用的OLED分辨率是128x64。这里......
  • 一键解决UnicodeDecodeError: ‘utf-8’ codec can’t decode byte 0xa1 in position
    UnicodeDecodeError:‘utf-8’codeccan’tdecodebyte0xa1inposition0:invalidstartbyte文章目录问题描述解决思路解决方法问题描述UnicodeDecodeError:‘utf-8’codeccan’tdecodebyte0xa1inposition0:invalidstartbyte解决思路这个错误表明你正在试图以......
  • java中 int (double、float、long等等) 与 String 之间的相互转换
    int转String(double、float、long等同理)方法1 inti=28; Strings=i+"";此方法在将i转换成s时,会额外产生一个""常量对象存放在常量池中方法2 inti=28; Strings=String.valueOf(i);方法3 inti=28; Strings=Integer.toString(i);String转in......
  • pytest报错UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc3 in position 1
    报错UnicodeDecodeError:'utf-8'codeccan'tdecodebyte0xc3inposition11:invalidcontinuationbyte代码运行时,报错 可以看出是编码的问题,根据提示,有可能是__init__.py文件的问题,通过查看源代码:尝试改变"utf-8"为“gbk"路径:C:\python3.8\Lib\site-packages\inic......