昨天在公司听见同事在询问中文与asicii码如何转换?我当时就很差异,asicii码怎么可能表示中文啊?!原来是要将形如\uXXXX(X表示一16进制数,非X)的码与中文转换。好吧,我刚知道“这竟然被叫成asicii码”!
于是现在网上找了一下资料,对参考的代码进行了一些优化,如StringBuffer的使用和正则表达式验证合法性。
通过思考,已经能理解Unicode向字符的转换,对相反的转换的原理基本理解,还需要查查原理。
基本理论:
Unicode(统一码、万国码、单一码)是一种在计算机上使用的字符编码。它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。目前6.0版本已经发布。Unicode定义了大到足以代表人类所有可读字符的字符集。Unicode是国际组织制定的可以容纳世界上所有文字和符号的字符编码方案。Unicode用数字0-0x10FFFF来映射这些字符,最多可以容纳1114112个字符,或者说有1114112个码位。码位就是可以分配给字符的数字。
Unicode的实现方式有UTF-8、UTF-16、UTF-32。
UTF-8以字节为单位对Unicode进行编码,对不同范围的字符使用不同长度的编码。
UTF-16编码以16位无符号整数为单位。
UTF-32编码以32位无符号整数为单位。Unicode的UTF-32编码就是其对应的32位无符号整数。
形如\u1234的unicode应是采取utf-16的实现方式,所以以下encode方法中先将字符用utf-16方式表示,将每8bit放入byte中,然后将byte转为16进制表示,4个16进制符号就表示一个字符的unicode编码了。
其中与0xff的与运算和删除符号表示两个步骤都是必须的。
1,不进行0xff与,然后输出bytesUtf16[n],感觉诧异,byte不就8bit吗,怎么存输出2+个16位符号?后两个符号是需要的,所以有了&操作。后来理解,因为符号引起的前方补位。-的前补1,16制后前全为f,+补0,16制后仍是byte的16制。所以这里需要与0xff,致使只剩下后8位。也就是编码需要的。
2,Unicode标准建议用BOM(Byte Order Mark)来区分字节序,即在传输字节流前,先传输被作为BOM的字符"零宽无中断空格"。这个字符的编码是FEFF,而反过来的FFFE(UTF-16)和FFFE0000(UTF-32)在Unicode中都是未定义的码位,不应该出现在实际传输中,所以又删除符号操作。
//将字符转为unicode
public static String encode(String str) {
if (null == str || str.equals(""))
return "输入字符";
StringBuffer sb = new StringBuffer();
try {
//用16bit数字编码表示一个字符,每8bit用byte表示。
byte bytesUtf16[] = str.getBytes("UTF-16");
for (int n = 0; n < bytesUtf16.length; n++) {
// 截取后面8位,并用16进制表示。
str = (java.lang.Integer.toHexString(bytesUtf16[n] & 0XFF));
// 将获得的16进制表示连成串
sb.append((str.length() == 1) ? ("0" + str) : str);
}
// 去除第一个标记字符
str = sb.toString().toUpperCase().substring(4);
char[] chs = str.toCharArray();
str = "";
for (int i = 0; i < chs.length; i = i + 4) {
str += "\\u" + chs[i] + chs[i+1] + chs[i+2] + chs[i+3];
}
} catch (Exception e) {
System.out.print(e.getMessage());
str = "程序出现异常";
} finally {
return str;
}
}
//將unicode转为字符
public static String decode(final String str) {
if(null == str || str.equals("")){
return "輸入unicode";
}
//用正则表达式验证
Pattern p = Pattern.compile("(\\\\u[0-9a-fA-F]{4})+");
Matcher m = p.matcher(str);
if(!(m.find() && m.group().equals(str))){
return "非法格式";
}
String[] strs = str.split("u");
StringBuffer sb = new StringBuffer();
for (int i = 1; i <= strs.length - 1; i++) {
sb.append(new Character((char) Integer.parseInt(strs[i].replace("\\", ""), 16)));
}
return sb.toString();
}
分享到:
相关推荐
本篇文章将详细探讨ANSI字符串与Unicode字符串的相互转换及其重要性。 首先,我们要理解ANSI字符串的概念。ANSI字符串实际上是一个历史遗留的术语,它通常指的是基于特定区域设置的本地化ASCII扩展编码,如Windows...
在进行字符串与Unicode之间的转换时,需要考虑编码转换的过程,确保数据正确无误。例如,从AnsiString转换到UnicodeString时,需要知道原始字符串的编码,反之亦然。 在“字符串与Unicode互转工具”中,可能包含...
C# 提供了丰富的字符串处理功能,包括将字符串与 Unicode 编码进行转换的能力。本文将详细介绍如何在 C# 中实现字串与 Unicode 的相互转换,并通过具体的代码示例来展示这一过程。 #### 一、C# 字串转 Unicode 方法...
本工具专注于ANSI和UNICODE字符串与十六进制之间的转换,这涉及到字符编码和二进制数据的理解。 首先,我们要理解ANSI和UNICODE的概念。ANSI字符串通常指的是基于特定地区或语言的ASCII编码,它使用7位或8位来表示...
本文将深入探讨在VC++环境下,如何在ASCII、UNICODE以及ANSI编码之间进行字符串与数字的转换,以及Unicode与ANSI之间的转换。 首先,让我们看看字符串转数字的方法。在C运行时库(CRT)中,提供了如`atoi`、`atol`、`...
### C#字符串与Unicode互相转换实战案例分析 在软件开发过程中,字符编码处理是一项非常重要的技术环节。尤其是在国际化应用中,正确地处理不同语言的文字变得尤为关键。C#作为一种广泛使用的编程语言,提供了丰富...
2. 使用 `setlocale` 函数设置当前地域信息,并使用 `swprintf` 函数将 Ansi 字符串转换为 Unicode 字符串。 Unicode 转 Ansi Unicode 转 Ansi 也有两种方法: 1. 使用 `WideCharToMultiByte` 函数,该函数可以将...
字符编码转换 字符串到Unicode的转换等 字符高低位转换等。
在C语言中,进行字符编码转换通常涉及到内存操作和位操作,因为C语言没有内置的字符串类或者编码转换函数。以下是一些基本步骤: 1. **读取原始编码**:首先,你需要读取源文件或字符串,确定其当前的编码格式。这...
该“字符串转Unicode小工具程序”主要功能是将普通的字符串转换为Unicode编码形式。在VB6.0中,这个过程可以通过使用`StrConv`函数来实现。`StrConv`函数可以将字符串转换为不同的格式,包括Unicode编码。例如,以下...
适用于需要字符串转化成Unicode代码的地方、譬如触摸屏、LCD、单片机、串口通信。
C语言字符串转换为Python字符串是指将C语言中的字符串数据转换为Python中的字符串对象,以便在Python环境中使用。下面详细介绍了C语言字符串转换为Python字符串的方法。 使用Py_BuildValue()构建字节对象 在Python...
为了解析Unicode的JSON字符串,我们需要对CJSON进行扩展,使其支持宽字符。首先,你需要理解CJSON的基本使用方法,例如`cJSON_Parse()`函数用于解析JSON字符串,返回一个`cJSON`结构体指针,而`cJSON_Print()`或`...
vs2008下Unicode字符串和ANSI 字符串的相互转换 一直都很不习惯vs2008下的编程,是因为其对字符串的用法不像VC6那样方便了,其实这也增加了对字符串的安全检查, 这里我花了一下午的时间研究,终于搞懂了Unicode字符...
UnicodeCode编码转换成字符串编码的C#类 \uA054\uA055 => "中文
utf8字符串与unicode的相互转换。 在utf8编码的网页上输入字符串后, 可产生unicode编码字符串, 然后再还原回原先的utf8字符串。html/PHP实现。
在JavaScript中,与Unicode转换相关的重要方法主要有: 1. charCodeAt()方法:此方法用于返回字符串中指定位置的字符的Unicode编码。它接受一个索引作为参数,返回一个表示该字符Unicode编码的整数值。需要注意的是...
2. 字符编码与UNICODE转换 在计算机系统中,字符以二进制形式存在,这就需要一种规则,将字符映射到二进制数字,这个规则就是字符编码。ASCII码是最早的字符编码,只能表示128个基本拉丁字符。UNICODE则大大扩展了这...
本文将深入探讨 Unicode 与 ANSI 字符串之间的转换原理及实现方法,并通过一个具体的示例来展示如何在 C/C++ 环境中实现这两种字符串类型的转换。 ### Unicode 与 ANSI 的基本概念 #### Unicode Unicode 是一种...
运行环境Java JDK 5.0 Unicode字符转换为中文字符,中文字符转Unicode字符 Unicode字符只支持以\u####格式 <br>MS有人在找这东西,自己也找过,没找着就自己做了一个,功能简单只满足自己的需求:) pp