2009-05-21 101 views
3

在解决UTF-8,UTF-16,ASCII和ANSI之间的差异时遇到一些问题。在做了一些研究之后,我有一些想法,但如果有人能够准确解释它们之间的差异(包括每个典型字符的字节表示形式),那么这将非常有用。字符编码混乱!

我quess我的问题归结为

1) How do each of the above store characters as bytes 
2) What are the differences between the above standards 
3) What is a code page 
4) Method of converting characters between the various types. 

很多很多的感谢:)

+0

相关问题(在unicode标记中的大多数投票):http://stackoverflow.com/questions/222386 – mghie 2009-05-21 11:35:19

回答

12

我发现有关Unicode Joel's article来解释这个非常好。具体来说,它涵盖了历史(对于这个主题至关重要),编码(UTF-8/16等)和代码页。

0

O'Reilly的CJKV信息处理含有大量的字符集和字符编码背景:与CJKV数据特别关注的,当然。我发现将我的理解超越“我如何获得!*!**#@欧元符号以正确显示?”是有用的。“

0

在Unix上,使用名为recodeiconv的程序将文本文件转换为另一种编码,或在C或C++程序中使用iconv函数(man 3 iconv)。

如果您使用Perl,请使用Encode模块进行转换(例如use Encode; print encode("utf-8", "\xabfoo"))。如果您使用Python,请使用unicode.encode和/或str.decode(例如print u'\xabfoo'.encode('utf-8'))。

4

要快速尝试回答您的具体问题。

1:位的某种组合表示某个字符。单个字符可能以多个字节存储。

2:您提到的编码的简要信息和区别。

ASCII
包含128个字符的定义。

ANSI
具有比ASCII更多的字符,但仍然适合八位字节。需要一个代码页。

UTF-8
这可以用来表示任何Unicode字符。有很多更多的Unicode字符比ASCII的字符多。它将每个字符存储在一到四个八位字节的数据中。

UTF-16
与UTF-8类似,但基本单位是16位。如果你只是用英语,那么你在每个角色上都浪费了8位。

3:代码页是什么指定给计算机(比特组合)是指哪个字符。 Unicode不需要代码页,因为每个字符都有自己独特的位组合。 ANSI有代码页,因为它只有256个可用字符。例如,如果您在阿拉伯语的计算机上,则会将阿拉伯语设置为代码页,并且可以显示阿拉伯字符。

4:转换的方法取决于您要转换为的字符集以及使用的代码页(如果有)。有些转换可能无法进行。 UTF-8向后兼容ASCII,这意味着如果您的文本仅包含前128个美国字符,则与ASCII编码中的相同文本完全相同。

这个答案是临时的,可能会有错误,更正欢迎。

0

一对夫妇是需要了解的随机点:

  • 约UTF-8和 ASCII一个有趣的事情是,127 ASCII字符 在正好在UTF-的 相同的编码方式8(这也可能是 与其他UTF方案的情况,我是 不确定)换句话说,在 的ASCII范围或字符内,ASCII 和UTF-8都是可以互换的 。

    UTF-8的可变长度是这样的: 。第一个“ ”127个字符分别由一个 单个字节表示。除此之外,它 开始使用多个字节。 解码器如何知道是将 字节解释为单个ASCII字符还是将 解释为多字节序列的一部分? 因为在 字节开始时的比特按照一定的图案:一个 零位在开始意味着它是一个 单字节字符,和Ñ 1比特 表示该字节是 一个Ñ开始字节序列。

  • 而且,不同的语言将 转换他们的本地字符串到 不同的编码,当你输出 它们,例如,在 文件或在屏幕上打印出来。因此,如果 您对 和平台之间的 可互换性感兴趣,则应该始终指定 要如何输出您的 语言的字符串类型。否则你会得到奇怪的和意想不到的错误!

  • UTF-8也是XML的标准。