在解决UTF-8,UTF-16,ASCII和ANSI之间的差异时遇到了一些问题。在做了一些研究之后我有了一些想法,但如果有人能够准确地解释它们之间的区别(包括每个区域中典型字符的字节表示),那将非常有用。
我问我的问题归结为
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 :(得分:12)
我在Unicode上找到了Joel's article来解释这个问题。具体来说,它涵盖了历史(对于这个主题至关重要),编码(UTF-8/16等)和代码页。
答案 1 :(得分: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编码中的相同文本完全相同。
这个答案是临时性的,可能有错误,更正欢迎。
答案 2 :(得分:2)
从The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)开始(来自软件博客上的Joel)
答案 3 :(得分:0)
O'Reilly CJKV信息处理包含很多关于字符集和字符编码的背景知识:当然,特别注意CJKV数据。我发现除了“我如何得到一个!*!**#@ Euro符号以便正确显示?”之后我的理解很有用。
答案 4 :(得分:0)
在Unix上,使用名为recode
或iconv
的程序将文本文件转换为其他编码,或使用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')
)。
答案 5 :(得分:0)
一些有用的随机要点:
关于UTF-8的一个有趣的事情 ASCII是127 ASCII 字符编码正好 同样的方式在UTF-8(这也可能是 与其他UTF方案一样,我是 不确定)换句话说,在内 ASCII范围或字符,均为ASCII 和UTF-8完全一样 互换。
这就是这样的 UTF-8是可变长度的;首先” 127个字符由a表示 每个单字节。除此之外,它 开始使用多个字节。如何 解码器知道是否解释a 字节作为单个ASCII字符或 作为多字节序列的一部分? 因为位在开头 字节遵循某些模式:a 开头的零位意味着它是一个 单字节字符, n 1位 意味着这个字节是开头的 一个 n 字节序列。
此外,不同的语言会 将其原生字符串转换为 输出时的编码不同 例如,他们打印出来 文件或在屏幕上。因此,如果 你有兴趣 语言之间的可互换性 和平台,你应该永远 详细说明你的喜好 要输出的语言字符串类型。否则你会收到奇怪和意外的错误!
UTF-8也是XML的标准。