大家来讨论一下unicode和utf-8

sunxing007 2009-07-22 04:14:26
加精
从一篇帖子开始,http://blog.csdn.net/sfdev/archive/2009/01/13/3770706.aspx, 决定好好探究一下unicode和utf-8的关系.
总算大约明白:unicode是一种编码方式,它涵盖了世界上大多数国家语言字符并对其编码, 使每个编码都唯一; 这个工作使每个字符有了一个编号;也可以说这个工作是把世界范围内的字符映射到一个自然数集。
问题1:我这样理解对么?维基百科中关于unicode的解释中有一句话:Unicode 的实现方式不同于编码方式。一个字符的 Unicode 编码是确定的。但是在实际传输过程中,由于不同系统平台的设计不一定一致,以及出于节省空间的目的,对 Unicode 编码的实现方式有所不同。Unicode 的实现方式称为Unicode转换格式(Unicode Translation Format,简称为 UTF)。
我这样理解这句话:
如果直接用unicode编码存储或传输字符,会遇到问题,因为计算机中存贮,传输的单位是字节,遇到的问题是:不好断字,一个字符占用几个子节无法确定,(还有一个问题是不同系统平台的设计不一定一致,这个先不说);所以需要有一种机制实现编码到字节序列的映射,并且能够标明字符边界:比如utf-8中:在ASCII码的范围的,用一个字节表示,且最高位为0;大于ASCII码的,比如110xxxxxx前三位的二进制表示告诉我们这是个 2BYTE的UNICODE字符;1110xxxx是个三位的UNICODE字符,依此类推.
问题2: 我这样理解unicode的实现方式对么?同时, 既然unicode只是一种编码方式,不是实现方式,那么打开记事本选择:file -> save as -> encoding选项中unicode是指哪种实现方式? unicode little endian?

问题3: String s = new String(new char[]{'A'}); s放的是字符序列,是哪种编码? 平台的编码还是unicode? s.getBytes("utf-8")得到该字符串的utf-8编码方式的byte序列,那么s.getBytes("unicode");又是哪种实现方式? unicode little endian?

欢迎讨论,欢迎指导! 给链接的不要, 因为你看到我都看过.
...全文
2024 115 打赏 收藏 转发到动态 举报
写回复
用AI写文章
115 条回复
切换为时间正序
请发表友善的回复…
发表回复
tanguolovepig 2011-05-27
  • 打赏
  • 举报
回复
mark.
poqer 2010-06-18
  • 打赏
  • 举报
回复
学习了
P神 2010-06-11
  • 打赏
  • 举报
回复
不大清楚具体的情况。。。
guangguang0512 2009-12-10
  • 打赏
  • 举报
回复
同样关注
x1123595 2009-07-30
  • 打赏
  • 举报
回复
一般都不用unicod...这个很乱
liu_yoo 2009-07-28
  • 打赏
  • 举报
回复
一起学习了.
liuweiyang0222 2009-07-25
  • 打赏
  • 举报
回复
同关注
baty012 2009-07-25
  • 打赏
  • 举报
回复
感觉就不用很明白只是两种占的空间不一样,它的节省空间
vakano 2009-07-24
  • 打赏
  • 举报
回复
编码还是很有必要好好研究一下的!
leonzhang2008 2009-07-24
  • 打赏
  • 举报
回复
Unicode(统一码、万国码、单一码)是一种在计算机上使用的字符编码。它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。1990年开始研发,1994年正式公布。随着计算机工作能力的增强,Unicode也在面世以来的十多年里得到普及。

  UTF-8
  UTF-8以字节为单位对Unicode进行编码。从Unicode到UTF-8的编码方式如下:
  Unicode编码(16进制) ║ UTF-8 字节流(二进制)
  000000 - 00007F ║ 0xxxxxxx
  000080 - 0007FF ║ 110xxxxx 10xxxxxx
  000800 - 00FFFF ║ 1110xxxx 10xxxxxx 10xxxxxx
  010000 - 10FFFF ║ 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

// str -> 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
*/
function unicode_str($str)
{
$len = strlen($str);
$i = 0;
$unicode_str = '';
while ($i < $len)
{
$temp_str=$str[$i];
if (ord($temp_str) > 0 && ord($temp_str) < 192)
{
$new_str[]=substr($str,$i,1);
$i++;
}
else if (ord($temp_str) >=192 && ord($temp_str) < 224)
{
$new_str[]=substr($str,$i,2);
$i += 2;
}
else if (ord($temp_str) >=224 && ord($temp_str) < 240)
{
$new_str[]=substr($str,$i,3);
$i += 3;
}
else if (ord($temp_str) >=240 && ord($temp_str) < 248)
{
$new_str[]=substr($str,$i,4);
$i += 4;
}
else if (ord($temp_str) >=248 && ord($temp_str) < 252)
{
$new_str[]=substr($str,$i,5);
$i += 5;
}
else if ( ord($temp_str) >= 252)
{
$new_str[]=substr($str,$i,6);
$i += 6;
}
}
foreach ($new_str as $v)
{
$unicode_str .= utf8_unicode($v);
}
return $unicode_str;
}

// utf8 -> unicode
function utf8_unicode($c)
{
switch(strlen($c))
{
case 1:
$n = ord($c);
break;
case 2:
$n = (ord($c[0]) & 0x3f) * 0x40;
$n += (ord($c[1]) & 0x3f);
break;
case 3:
$n = (ord($c[0]) & 0x1f) * 0x1000;
$n += (ord($c[1]) & 0x3f) * 0x40;
$n += ord($c[2]) & 0x3f;
break;
case 4:
$n = (ord($c[0]) & 0x0f) * 0x40000;
$n += (ord($c[1]) & 0x3f) * 0x1000;
$n += (ord($c[2]) & 0x3f) * 0x40;
$n += ord($c[3]) & 0x3f;
break;
case 5:
$n = (ord($c[0]) & 0x07) * 0x1000000;
$n += (ord($c[1]) & 0x3f) * 0x40000;
$n += (ord($c[2]) & 0x3f) * 0x1000;
$n += (ord($c[3]) & 0x3f) * 0x40;
$n += ord($c[4]) & 0x3f;
break;
case 6:
$n = (ord($c[0]) & 0x03) * 0x40000000;
$n += (ord($c[1]) & 0x3f) * 0x1000000;
$n += (ord($c[2]) & 0x3f) * 0x40000;
$n += (ord($c[3]) & 0x3f) * 0x1000;
$n += (ord($c[4]) & 0x3f) * 0x40;
$n += ord($c[5]) & 0x3f;
break;
}
if ($n < 0xf)
{
return "\u000".dechex($n);
}
else if($n < 0xff)
{
return "\u00".dechex($n);
}
else if($n < 0xfff)
{
return "\u0".dechex($n);
}
else
{
return "\u".dechex($n);
}
}
DOLPHIN_play_87806 2009-07-24
  • 打赏
  • 举报
回复
一般只用UTF-8,那个不太懂!
dinghun8leech 2009-07-24
  • 打赏
  • 举报
回复
标注,尔后学习。
向楼主及所有拿到10分以上的大牛致敬
xinghuanonline 2009-07-24
  • 打赏
  • 举报
回复
up
konta 2009-07-24
  • 打赏
  • 举报
回复
mark先
tfsict2008 2009-07-24
  • 打赏
  • 举报
回复
String str = "\u4e00";//一
System.out.println(str);
byte[] b = str.getBytes();
for(byte i : b){
System.out.println(Integer.toHexString(i));
}
// 输出
ffffffd2
ffffffbb
为什么?
rockey116 2009-07-24
  • 打赏
  • 举报
回复
学习
Bairrfhoinn 2009-07-24
  • 打赏
  • 举报
回复
学习了。
zzmoutmans 2009-07-24
  • 打赏
  • 举报
回复
回帖是一种美德!
zxf327561 2009-07-24
  • 打赏
  • 举报
回复
学习一下!!!
zb_fly 2009-07-24
  • 打赏
  • 举报
回复
格式应该和系统平台有关系
加载更多回复(93)

81,094

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧