我无法理解编码的一些关键要素:
给出ASCII文本:Hello World,如果我想将其转换为Latin1或BIG5,此过程中正在使用哪种编码算法?更具体地说,Latin1 / Big5是使用自己的编码算法还是我必须使用UTF算法?
答案 0 :(得分:1)
1:Ascii只是一种编码-一种非常简单的编码。实际上,它只是映射到字符和控制代码的有符号字节(0 ... 127)的正端。
请参阅https://www.ascii.codes/以查看完整内容并检查字符。
肯定有编码算法可以将ascii字符串与其他编码的字符串进行相互转换,但是如果您要暗示的是,则不需要像utf8或utf16那样编写或读取ascii字符串所需的压缩/解压缩算法。
2:LATIN-1也不是压缩的(通常称为“可变宽度”)编码,因此不需要进出该算法。
请参阅https://kb.iu.edu/d/aepu,以在概念上很好地描述LATIN-1和集合中的每个字符。像许多编码一样,它的前128个时隙只是ascii。与ascii一样,它的大小为1个字节,但它是一个 unsigned 字节,因此在最后一个ascii字符(DEL / 127)之后,LATIN1将再添加128个字符。
与从一种字符串编码到另一种字符串编码的任何转换一样,有一种专门为该转换量身定制的算法。
3:再次,unicode编码就是这种编码。但是除了utf32以外,它们都已压缩。因此,除非您使用utf32,否则始终需要执行压缩/解压缩步骤才能对其进行读写。
注意:使用utf32字符串时,必须考虑一个非线性的奇数...组合字符。从技术上讲,这是另一种压缩方式,因为它们通过不给未组合字符和组合字符的每种可能组合提供代码点来节省空间。他们“预组合”了一些,但是如果全部完成,它们将很快用尽插槽。
4:是的。压缩的unicode编码的压缩/解压缩算法仅适用于那些编码。它们不适用于任何其他编码。
请考虑一下zip / unzip。当然,解压缩除压缩文件或文件夹以外的任何内容都不会起作用。这适用于一开始没有被压缩的东西,以及被压缩但使用另一种压缩算法(例如:rar)的东西。
我最近为正在开发的新跨平台库编写了utf8和utf16压缩/解压缩代码,如果您将Big5编码的字符串输入到我专门为解压缩utf8而编写的方法中,我可以很自信地告诉您...它不仅不起作用,而且很可能崩溃。
回复:您的“ Hello World”问题...请参阅我对有关LATIN-1的第二个问题的回答。从ascii到LATIN-1不需要转换,因为LATIN-1 的前128个字符(0 ... 127)是。如果您是从LATIN-1转换为ascii,则对于LATIN-1的下半部分也是如此,但是如果字符串中的字符超过127,则称为“有损” /部分转换还是完全失败,具体取决于您对损失的承受程度。但是,在您的示例中,“ Hello World”中的所有字符在两种编码中都具有完全相同的值,因此可以完美地在任一方向上进行转换而不会造成损失。
我对Big5几乎一无所知,但是无论如何,不要将utf-x算法用于其他编码。其中的每一种都是专门针对一种特定的编码(或在转换的情况下:对个编码)编写的。
如果您对utf8 / 16压缩/解压缩算法感到好奇,则应在unicode网站上开始(请注意。他们在其文档中没有使用压缩/解压缩隐喻):
您可能不需要其他任何东西。
...,也许还有一个不错的代码点查找工具:https://www.unicode.codes/
您可以根据unicode文档滚动自己的代码,或使用官方的unicode库:
http://site.icu-project.org/home
希望这会有所帮助。
答案 1 :(得分:0)
通常,大多数编码方案(例如ASCII或Latin-1)都是大表,它们将字符映射到特定的字节序列。创建者如何提出这些特定的字符-字节关联,可能有或没有某种特定的算法,但是通常没有比这更多的东西了。
Unicode的创新之一是间接地为每个字符分配一个唯一的数字,然后再担心如何将这个数字编码为字节。为此,有多种编码方案,从UCS和GB 18030编码到最常用的UTF-8 / UTF-16编码。到现在为止,有些已经不存在了,例如UCS-2。每个人在空间权衡,易于处理和可传输性(例如,UTF-7用于在7位系统(例如电子邮件)上安全传输)方面各有利弊。 Unless otherwise noted,它们都可以对当前的Unicode字符进行完整的编码。
要从一种编码转换为另一种编码,您几乎需要将字节从一个表映射到另一个表。意思是,如果您查看EBCDIC table和Windows 1250 table,字符0xC1
和0x41
似乎都代表相同的字符“ A”,因此在两种编码,您会将这些字节映射为等效字节。是的,这意味着在每个可能的编码对之间都需要一个这样的映射。
由于这显然很费力,所以现代转换器实际上总是以Unicode作为中间人。这样,每种编码只需要映射到Unicode表,即可使用编码A→Unicode代码点→编码B 进行转换。最后,您只想确定哪些字符看起来相同/均值相同,并相应地更改字节表示形式。
答案 2 :(得分:0)
字符编码是从字符序列到字节序列的映射(过去也有编码到位序列-它们已经过时了)。通常,此映射是一对一的,但不一定是映射到。这意味着在此编码中可能存在与字符序列不对应的字节序列。
映射的域定义了可以编码的字符。
现在您的问题是
答案 3 :(得分:0)
世界上的每个字符都被分配了一个unicode值[从0到...编号]。它实际上是一个独特的价值。现在,取决于个人如何使用该unicode值。他甚至可以直接使用它,也可以使用一些已知的编码方案,例如utf8,utf16等。编码方案将unicode值映射为某些特定的位序列[可以从1字节变化为4字节,或者在将来可以是8了解Universe / Aliens / Multiverse 的所有语言,以便可以在编码方案中对其进行唯一标识。
例如ASCII是一种编码方案,仅编码所有字符中的128个字符。它为每个字符使用一个字节,相当于utf8表示形式。 GSM7是另一种格式,它使用每个字符7位来编码Unicode字符列表中的128个字符。
utf8: 对于unicode值为127的字符,它使用1个字节。 除此之外,它还有自己的表示unicode值的方式。 西里尔字母使用2个字节,印地语字符使用3个字节。
utf16: 对于unicode值为127的字符,它使用2个字节。 并且还将2个字节用于西里尔字母,北印度语字符。
所有utf编码方案都将初始位固定为特定模式[例如:110 | restbits],其余位[例如:initialbits | 11001]则采用unicode值进行唯一表示。
有关utf8,utf16,unicode的维基百科将予以明确说明。 我编写了一个utf转换器,将所有语言的输入utf8文本转换为等效的utf16文本。