UTF-8和ISO 8859-9

时间:2014-09-30 10:30:25

标签: database unicode utf-8 character-encoding iso

在过去的几天里,我一直在阅读关于UTF-8和unicode的内容,当我想到这一切时,当我读到UTF-8和ISO 8859-9不兼容时,我很困惑。

我有一个将数据存储为UTF-8的数据库。我要求客户支持各种ISO 8859-x代码页(即8859-3,8859-2,以及ISO 6937)。我的问题是:

  1. 由于我的数据摄取和数据库引擎类型是UTF-8,假设我使用unicode是否正确?

  2. 我知道unicode可以支持所有角色,这是可行的方法。但是,我的客户是欧洲实体,希望我们使用ISO代码页。所以我的问题是如何使用现有的UTF-8数据支持多个客户端使用案例?由于ISO 8859-x不是unicode的子集,我是否必须编写代码以根据我的用例发送适当的ISO 8859-x字符集?这是我需要做的还是还有更多呢?

  3. 不过,我的理解是UTF-8只是一种从二进制数据中获取数值的编码算法。如果是这样,如何应用字符集?我是否必须编写代码才能返回8859-x响应,或者所需要的只是在响应头中设置适当的字符集值?

1 个答案:

答案 0 :(得分:4)

主题非常广泛,所以让我简化(很多,甚至太多)并逐点回答。

  

由于我的数据摄取和数据库引擎类型是UTF-8,假设我使用unicode是否正确?

是的,您正在使用UNICODE 并且您正在使用UTF-8编码存储UNICODE字符(正式称为代码点)。请注意,UNICODE定义规则和字符集(即使相同的单词通常用作UTF-16编码的同义词),在字节流中对这些字符进行编码的方式也是另一回事。

  

...但是,我的客户是欧洲实体,希望我们使用ISO代码页。所以我的问题是如何使用现有的UTF-8数据支持多个客户端用例?

当然,如果您存储UNICODE字符(与哪种编码无关),那么您始终可以将它们转换为特定的ASCII代码页(或任何其他编码)。好的,这不是正式总是正确的(因为UNICODE没有定义过去实际使用/使用的每个可能的字符)但是我会忽略这一点......

  

...由于ISO 8859-x不是unicode的子集,我是否必须编写代码以根据我的用例发送适当的ISO 8859-x字符集?

ISO 8859 代码页中的所有字符也可在UNICODE中使用然后(从这个角度来看)它是一个子集。当然,编码值是不同的,因此需要进行转换。如果您知道每个客户所需的代码页,那么您始终可以将UNICODE UTF-8编码文本转换为ASCII(带有正确的代码页)文本。

  

这是我需要做的还是还有更多呢?

就是这样。代码可能很短,但您没有使用任何语言标记您的问题,因此我不会提供链接/示例。仅举几个基本示例,请查看this post

我还要说一件重要的事情:如果他们想要使用代码页以ASCII格式使用您的数据,那么您必须执行转换。如果他们可以直接使用UTF-8数据(或者你在自己的应用程序中以某种方式呈现它们),那么你不必担心代码页(这就是我们使用UNICODE的原因)因为 - 无需编码 - UNICODE字符集包含他们可能需要的所有角色。

  不过,我的理解是UTF-8只是一种从二进制数据中获取数值的编码算法。

不完全是。你有一张人物表,对吧?例如 A 。现在您必须存储一个将被解释为 A 的数值。在ASCII中,他们任意决定65是表示该字符的数值。 UNICODE是一个很长的字符列表(以及组合它们的规则),UTF-X是用于将它们存储为数值的任意表示。

  如果是,

如何应用字符集?

“字符集”是一个非常含糊的句子。使用 UNICODE字符集表示 UNICODE 可用的所有字符。如果您的意思是代码页然后(简化)它代表可用字符集的子集。想象一下,你有8位ASCII(最多256个符号),你不能容纳欧洲使用的所有字符,对吗?代码页解决了这个问题,这些符号中的一半总是相同的,另一半代表根据代码页的不同字符(每个“Country”将使用具有其首选字符的特定代码页)。

有关此主题的介绍性概述:The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets