UTF-8 有一下特性: UCS 字符 U+0000 到 U+007F (ASCII) 被编码为字节 0x00 到 0x7F (ASCII 兼容). 这意味着只包含 7 位 ASCII 字符的文件在 ASCII 和 UTF-8 两种编码方式下是一样的.
所有 >U+007F 的 UCS 字符被编码为一个多个字节的串, 每个字节都有标记位集. 因此, ASCII 字节 (0x00-0x7F) 不可能作为任何其他字符的一部分.
表示非 ASCII 字符的多字节串的第一个字节总是在 0xC0 到 0xFD 的范围里, 并指出这个字符包含多少个字节. 多字节串的其余字节都在 0x80 到 0xBF 范围里. 这使得重新同步非常容易, 并使编码无国界, 且很少受丢失字节的影响.
可以编入所有可能的 231个 UCS 代码
UTF-8 编码字符理论上可以最多到 6 个字节长, 然而 16 位 BMP 字符最多只用到 3 字节长.
Bigendian UCS-4 字节串的排列顺序是预定的.
字节 0xFE 和 0xFF 在 UTF-8 编码中从未用到.
下列字节串用来表示一个字符. 用到哪个串取决于该字符在 Unicode 中的序号.U-00000000 - U-0000007F: 0xxxxxxx
U-00000080 - U-000007FF: 110xxxxx 10xxxxxx
U-00000800 - U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx
U-00010000 - U-001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
U-00200000 - U-03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
U-04000000 - U-7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx xxx 的位置由字符编码数的二进制表示的位填入. 越靠右的 x 具有越少的特殊意义. 只用最短的那个足够表达一个字符编码数的多字节串. 注意在多字节串中, 第一个字节的开头"1"的数目就是整个串中字节的数目.例如: Unicode 字符 U+00A9 = 1010 1001 (版权符号) 在 UTF-8 里的编码为:11000010 10101001 = 0xC2 0xA9而字符 U+2260 = 0010 0010 0110 0000 (不等于) 编码为:11100010 10001001 10100000 = 0xE2 0x89 0xA0这种编码的官方名字拼写为 UTF-8, 其中 UTF 代表 UCS Transformation Format. 请勿在任何文档中用其他名字 (比如 utf8 或 UTF_8) 来表示 UTF-8, 当然除非你指的是一个变量名而不是这种编码本身
所有 >U+007F 的 UCS 字符被编码为一个多个字节的串, 每个字节都有标记位集. 因此, ASCII 字节 (0x00-0x7F) 不可能作为任何其他字符的一部分.
表示非 ASCII 字符的多字节串的第一个字节总是在 0xC0 到 0xFD 的范围里, 并指出这个字符包含多少个字节. 多字节串的其余字节都在 0x80 到 0xBF 范围里. 这使得重新同步非常容易, 并使编码无国界, 且很少受丢失字节的影响.
可以编入所有可能的 231个 UCS 代码
UTF-8 编码字符理论上可以最多到 6 个字节长, 然而 16 位 BMP 字符最多只用到 3 字节长.
Bigendian UCS-4 字节串的排列顺序是预定的.
字节 0xFE 和 0xFF 在 UTF-8 编码中从未用到.
下列字节串用来表示一个字符. 用到哪个串取决于该字符在 Unicode 中的序号.U-00000000 - U-0000007F: 0xxxxxxx
U-00000080 - U-000007FF: 110xxxxx 10xxxxxx
U-00000800 - U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx
U-00010000 - U-001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
U-00200000 - U-03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
U-04000000 - U-7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx xxx 的位置由字符编码数的二进制表示的位填入. 越靠右的 x 具有越少的特殊意义. 只用最短的那个足够表达一个字符编码数的多字节串. 注意在多字节串中, 第一个字节的开头"1"的数目就是整个串中字节的数目.例如: Unicode 字符 U+00A9 = 1010 1001 (版权符号) 在 UTF-8 里的编码为:11000010 10101001 = 0xC2 0xA9而字符 U+2260 = 0010 0010 0110 0000 (不等于) 编码为:11100010 10001001 10100000 = 0xE2 0x89 0xA0这种编码的官方名字拼写为 UTF-8, 其中 UTF 代表 UCS Transformation Format. 请勿在任何文档中用其他名字 (比如 utf8 或 UTF_8) 来表示 UTF-8, 当然除非你指的是一个变量名而不是这种编码本身
看看这个可以不?public static final String UTF8ToGBK(byte[] src)
{
try{
return new String(new String(src,"UTF-8").getBytes("GBK"));
}
catch (UnsupportedEncodingException e )
{
System.out.println("UTF8ToDefault:"+e.getMessage());
return null;
} }
It very easy!
byte []utf8 ;// 假设这个变量里已经存放了utf8编码的数据String unicodeStr = new String(utf8, "utf-8");//先转换为UNICODE字符串byte [] gbk = unicodeStr.getBytes("GBK");//转换为GBK编码数据
测试例子如下:
对于字符 “三”它的UTF-8编码是11001000,10111101(状态1)
转化成Unicode是00000010,00111101(状态2)
GBK 是11001000,11111101(状态3)
我现在要从状态1转到状态3,怎么实现??
String sanUnicode=new String(san.getBytes("GBK"));
String sanUTF8=new String(san.getBytes("UTF-8"));
String sanUTF8=new String(san.getbytes("GBK"),"UTF-8");
String gbk="你";
String utf=new String(gbk.getBytes("gb2312"),"utf-8");
System.out.println(utf);
这时候utf里面的字符都是java内核编码的字符,但是他们能够转换到标准的utf-8编码
如果这时候,你在一个以utf-8为默认编码的计算机上运行编译后的class文件,那么一定会输出 <你> 但是,如过你在windows系统下,输出一定是乱码
而且我是需要从utf-8转到gbk,还有什么好的方法吗??
这样就可以了
不要转来转去
你是一下看看
具体的楼主查一下类库
DataInputStream类
public String utfToGbk(byte[] utf_b){
// 返回gbk字符
}测试如下:byte[] utfb=new byte[2];
utfb[0]=-56;utfb[1]=-67; //这是汉字"三"的utf-8编码
String result=utfToGbk(utfb); //得到的结果应该是"三"
byte[] buf = ×××× //需要转化的东西用byte[]读进来。String temp= new String(buf, from) //from 是你已知的编码名称。在这里是UTF8buf = temp.getBytes(to);//to 是你要转成什么编码。 这里是GBK.需要注意的是在把字符串读进来之前要确定该字符串绝对是utf8,读进来时一定要用inputStream 流的方式,不要用reader. 转化好之后的byte[]数组可以用outputStream写出去,但是不要再转成字符串,也不能用writer写出去。
String gbk="你";
String utf=new String(gbk.getBytes("gb2312"),"utf-8");//注意这时候,utf字符串
已经是一个标准的utf-8字符对照到java编码了
String tmp=new String(utf.getBytes("utf-8"),"gb2312");//注意这就是把一个utf-8映射
到gbk编码的方法。
System.out.println(tmp);//输出的肯定是 <你>//所以如果你有一个utf-8编码的字符串,就可使用
String tmp=new String(utf.getBytes("utf-8"),"gb2312");祝你好运!
你的方法行不通!!!!
注意,我的方法有一个前提就是,你必须得到一个标准的utf-8的字符串
这样,你能不能把你的问题,详细的说明一下。如果不是很麻烦的话祝你好运!
有兴趣的朋友可以继续研究这个问题:描述如下:
public String utfToGbk(byte[] utf_b){
// 返回gbk字符(待Ntian
}
测试如下:byte[] utfb=new byte[2];
utfb[0]=-56;utfb[1]=-67; //这是汉字"三"的utf-8编码
String result=utfToGbk(utfb); //得到的结果应该是"三"