`
61party
  • 浏览: 1106513 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

使用 Java 将中文字符转换成 Unicode 编码

阅读更多

版权声明:转载时请务必保留以下作者信息和链接
作者:陈维(chenweionline@hotmail.com)作者的网站:http://www.chenwei.mobi

这两天操作XML使用到了Jdom,在创建XML文件并输出到硬盘的时候遇到一个中文编码的问题:Jdom默认输出的XML编码是UTF-8,但是文档中如果出现中文字符那么该中文字符就会变成乱码,造成XML文件无法被正确解析。

UTF -8应该是可以用来表示中文的吧?我不知道这是不是Jdom的一个BUG(Jdom 1.0,beta了10次的产物哦!)。我google了一下,大家解决这个问题的办法无非是把Jdom的输出字符集改为GBK或者GB2312,但是这样就会有一些副作用,如果在没有特定字符集(GBK或者GB2312)的操作系统上不是依然不能正确解析吗?一个比较好的解决办法是先把中文转换成 Unicode编码在直接输出,程序解析XML后的时候再把Unicode编码转回中文就没有问题了。

于是我查看了JDK的文档, 截至Java 5好像都没有做类似转换的类可以直接使用,但是我发现一个类 java.util.Properties,它的源代码里有两个私有(private)方法 loadConvert (char[] in, int off, int len, char[] convtBuf) 和 saveConvert(String theString, boolean escapeSpace) 其实就是做特殊字符和Unicode编码字符间转换的,我把它们提取出来,单独包装到一个类里就可以使用了。

下面是我包装的类 CharacterSetToolkit.java,若你在项目中使用请不要改变package及author等作者信息。

/**//*
*CharacterSetToolkit.java
*
*Createdon2007年5月17日,上午11:04
*
*Tochangethistemplate,chooseTools|TemplateManager
*andopenthetemplateintheeditor.
*/


packagemobi.chenwei.wing.util;

/***//**
*进行字符操作的工具类。

*
@authorChenWei
*@websitewww.chenwei.mobi
*@emailchenweionline@hotmail.com
*/

publicclassCharacterSetToolkit...{

/***//**CreatesanewinstanceofCharacterSetToolkit*/
publicCharacterSetToolkit()...{
}


privatestaticfinalchar[]hexDigit=...{
'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'
}
;

privatestaticchartoHex(intnibble)...{
returnhexDigit[(nibble&0xF)];
}


/***//**
*将字符串编码成Unicode。
*
@paramtheString待转换成Unicode编码的字符串。
*
@paramescapeSpace是否忽略空格。
*
@return返回转换后Unicode编码的字符串。
*/

publicstaticStringtoUnicode(StringtheString,booleanescapeSpace)...{
intlen=theString.length();
intbufLen=len*2;
if(bufLen<0)...{
bufLen
=Integer.MAX_VALUE;
}

StringBufferoutBuffer
=newStringBuffer(bufLen);

for(intx=0;x<len;x++)...{
charaChar=theString.charAt(x);
//Handlecommoncasefirst,selectinglargestblockthat
//avoidsthespecialsbelow
if((aChar>61)&&(aChar<127))...{
if(aChar=='\')...{
outBuffer.append(
'\');outBuffer.append('\');
continue;
}

outBuffer.append(aChar);
continue;
}

switch(aChar)...{
case'':
if(x==0||escapeSpace)
outBuffer.append(
'\');
outBuffer.append(
'');
break;
case' ':outBuffer.append('\');outBuffer.append('t');
break;
case' ':outBuffer.append('\');outBuffer.append('n');
break;
case' ':outBuffer.append('\');outBuffer.append('r');
break;
case' ':outBuffer.append('\');outBuffer.append('f');
break;
case'='://Fallthrough
case':'://Fallthrough
case'#'://Fallthrough
case'!':
outBuffer.append(
'\');outBuffer.append(aChar);
break;
default:
if((aChar<0x0020)||(aChar>0x007e))...{
outBuffer.append(
'\');
outBuffer.append(
'u');
outBuffer.append(toHex((aChar
>>12)&0xF));
outBuffer.append(toHex((aChar
>>8)&0xF));
outBuffer.append(toHex((aChar
>>4)&0xF));
outBuffer.append(toHex(aChar
&0xF));
}
else...{
outBuffer.append(aChar);
}

}

}

returnoutBuffer.toString();
}


/***//**
*从Unicode码转换成编码前的特殊字符串。
*
@paraminUnicode编码的字符数组。
*
@paramoff转换的起始偏移量。
*
@paramlen转换的字符长度。
*
@paramconvtBuf转换的缓存字符数组。
*
@return完成转换,返回编码前的特殊字符串。
*/

publicStringfromUnicode(char[]in,intoff,intlen,char[]convtBuf)...{
if(convtBuf.length<len)...{
intnewLen=len*2;
if(newLen<0)...{
newLen
=Integer.MAX_VALUE;
}

convtBuf
=newchar[newLen];
}

charaChar;
char[]out=convtBuf;
intoutLen=0;
intend=off+len;

while(off<end)...{
aChar
=in[off++];
if(aChar=='\')...{
aChar
=in[off++];
if(aChar=='u')...{
//Readthexxxx
intvalue=0;
for(inti=0;i<4;i++)...{
aChar
=in[off++];
switch(aChar)...{
case'0':
case'1':
case'2':
case'3':
case'4':
case'5':
case'6':
case'7':
case'8':
case'9':
value
=(value<<4)+aChar-'0';
break;
case'a':
case'b':
case'c':
case'd':
case'e':
case'f':
value
=(value<<4)+10+aChar-'a';
break;
case'A':
case'B':
case'C':
case'D':
case'E':
case'F':
value
=(value<<4)+10+aChar-'A';
break;
default:
thrownewIllegalArgumentException(
"Malformed\uxxxxencoding.");
}

}

out[outLen
++]=(char)value;
}
else...{
if(aChar=='t')...{
aChar
=' ';
}
elseif(aChar=='r')...{
aChar
=' ';
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gi
分享到:
评论

相关推荐

    java 中文Unicode转换

    将中文字符转换为Unicode编码,可以使用`Character`类的`toChars()`方法,或者直接通过字符串的`codePointAt()`方法获取码点,然后以"\u"开头的十六进制格式表示。例如: ```java String chineseStr = "你好"; for ...

    Java做的Unicode编码转换器

    Java编写的Unicode编码转换器是一种实用工具,它能够帮助用户将各种国家和地区的文字转换成Unicode编码,同时也能实现从Unicode编码回转到原始字符。Unicode是一种国际标准,旨在为全球所有的字符提供一个统一的编码...

    java实现十六进制字符unicode与中英文转换示例

    在Java编程语言中,处理Unicode编码和十六进制字符转换是一项常见的任务,特别是在处理文本数据时。本示例探讨了如何使用Java实现从Unicode十六进制字符串到中英文字符的转换,以及反过来的过程。理解Unicode和UTF...

    Unicode中文编码对照表

    标签“源码”暗示了这个话题可能涉及到编程和代码实现,可能讲解了如何在编程语言中使用Unicode编码来处理中文字符,例如Java、Python或C++。而“工具”标签则可能意味着存在某种工具或库,可以帮助开发者进行...

    Unicode码转中文和中文转Unicode码的最简便的方法

    这会将`a.txt`中的中文字符转换成Unicode码,并保存到`b.txt`中。 **Unicode码转中文**: 1. 假设你已经有了一个包含Unicode码的文件`b.txt`,现在要将其转换回中文。 2. 同样,打开命令行窗口并切换到`b.txt`...

    中文转化为unicode格式的方法类

    本文将深入探讨如何将中文字符转换为 Unicode 格式,并介绍一个名为 `unicodeConvert.java` 的 Java 类,该类已通过实际程序验证,确保了其功能的可行性。 Unicode 编码通常采用 UTF-8、UTF-16 或 UTF-32 这样的...

    中文转换成NCR编码

    当我们将中文字符转换为NCR编码,实际上是将每个中文字符转换为其对应的Unicode编码,并以"&#x"的形式呈现。例如,"利用"的Unicode编码是U+52294,"有效"的Unicode编码是U+75283,"的"的Unicode编码是U+96401。在...

    Java实现中文字符串与unicode互转工具类

    Java实现中文字符串与unicode互转工具类是指使用Java语言实现中文字符串与unicode码之间的相互转换。这个工具类主要用于解决中文字符串与unicode码之间的转换问题,提供了escape和unescape两个函数,分别用于将中文...

    Java字符串取GBKUNICODE编码和相互转换.doc

    ### Java字符串取GBK与UNICODE编码及相互转换详解 #### 一、引言 在处理中文等非ASCII字符时,经常需要对字符串进行编码转换,尤其是GBK和Unicode之间的转换。本文将详细介绍如何在Java中实现字符串从GBK到Unicode...

    字符转换为UNICODE工具

    “字符转换为UNICODE”就是将输入的字符按照UNICODE编码规则转换成对应的码点,通常以16进制或者10进制的数值形式表示。 3. "StringToChar.exe"工具的使用 "StringToChar.exe"看起来是一个小型的命令行工具,用于将...

    java字符串的各种编码转换

    ### Java字符串的编码转换 在Java中,处理不同字符集之间的字符串转换是一项常见任务。尤其是在处理国际化应用时,理解并掌握各种字符编码格式变得尤为重要。下面将介绍几种常见的字符编码格式以及如何在Java中实现...

    JAVA反编译和unicode转字符.rar

    Java反编译与Unicode字符转换是Java开发过程中两个重要的技术环节。反编译是指将已编译的字节码(.class文件)转换回源代码的过程,这对于理解已有的类库或者进行逆向工程非常有用。Unicode是国际通用的字符编码标准,...

    Unicode编码转换源码

    在计算机科学领域,字符编码是将字符转换为二进制表示的过程,以便计算机可以处理和存储文本。Unicode编码是一种国际标准,旨在解决不同语言和字符集之间的兼容性问题。Unicode编码转换源码主要关注如何在不同的编码...

    JAVA中汉字字符转化为英文字符

    本文将详细介绍如何在Java中实现汉字到英文字符的转换。此技术主要用于提取汉字的首字母或进行其他基于字符编码的操作。通过以下两个核心方法:`toTureAsciiStr` 和 `nuToTrueAsciiStr`,我们将探讨其实现原理及其...

    Unicode编码转GBK编码(汉字转GBK)

    在网上找资料很少有汉字直接转GBK编码格式,一般都是汉字转Unicode编码,这套是将汉字先转换成Unicode编码,在通过参照表得出汉字的GBK编码数据。虽然是一个js文件,但是加以修改可以用于很多平台上如:小程序,...

    Java Unicode 和字符集

    在Java中,字符串是以Unicode的形式存储的,这意味着Java的String类内部使用UTF-16编码来表示字符。Java通过使用`char`类型来表示单个Unicode字符,该类型占用16位,足够表示基本多文种平面上的所有字符。对于超出...

    关于JAVA字符编码:Unicode,ISO-8859-1,GBK,UTF-8编码及相互转换

    ### 关于JAVA字符编码:Unicode, ISO-8859-1, GBK, UTF-8 编码及相互转换 在Java开发过程中,字符编码是处理文本数据的基础,不同的编码方式会影响数据的存储、传输以及显示。本文将详细介绍几种常见的字符编码...

    java字符串编码转换

    ### Java字符串编码转换详解 #### 一、Java 字符串编码转换基础 在Java中,字符串的处理是非常常见的操作之一,而字符编码是确保数据正确显示的关键因素。本篇文章将重点介绍Java中字符串编码的转换方法及其在Web...

    JAVA字符编码:Unicode,ISO-8859-1,GBK,UTF-8编码及相互转换

    ### JAVA字符编码详解:Unicode, ISO-8859-1, GBK, UTF-8 及其相互转换 #### 一、引言 在Java编程中,字符编码的管理和转换是一项基本而又重要的任务。不同的编码标准适用于不同的场景,而理解和掌握这些编码之间...

    Java中编码方式和Unicode知识总结

    编码是将字符转换为计算机可以处理的二进制形式的过程。Unicode是一种国际标准编码方式,旨在为世界上所有的文字提供一个唯一的数字标识。以下是对Java中编码方式和Unicode的知识点总结: 1. 基本概念 - bit:...

Global site tag (gtag.js) - Google Analytics