3
Unicode UTF转换器
目的是在UTF FAQ中给出的官方Unicode编码之间创建完全兼容的转换器。鉴于这是以Unicode为中心的,我将使用所涉及的最佳编码来接受最低字节数的答案(除非您使用APL进行编程,否则它可能是UTF-8)。我为冗长的帖子表示歉意,但其中很多内容都在解释编码,这些编码也可以在官方规范(pdf,第3.9 D90-D92节)或Wikipedia中进行访问。。 技术指标 如果您选择的语言在任何时候都不能完全满足要求,请使用符合给定规则精神的内容代替它。例如。并非每种语言都有内置的数组,函数等。 不使用字符串库/函数或编码库/函数。此代码的重点是使用位/字节操作实现转换器。但是,允许将字符串本身以字符或字节数组的形式使用。哦,也没有执行转换的OS调用。 转换器是一个具有三个参数的函数:代表已编码输入字符串的字节数组,以及以数字表示的“输入”和“输出”编码。我们将按此UTF-8, UTF-16, UTF-16BE, UTF-16LE, UTF-32, UTF-32BE, and UTF32LE顺序任意分配从0到6的数字。无需检查数字是否为< 0或> 6,我们将假定这些参数正确。转换器将以所需的输出编码返回有效的字节数组。 我们将使用空字符(U+0000)作为字符串终止符。此后的任何内容都无关紧要。我们将假设输入数组在某处具有空字符,因此您无需进行边界检查。 根据FAQ,如果输入字节数组对其声明的编码无效,则必须发出错误信号。我们将通过以下方式之一执行此操作:使程序崩溃,引发异常,返回null或返回其前四个字节全为0的数组(以便可以U+0000在每种编码中将其识别)。 编码 必须遵循官方规范,但是Wikipedia对编码提供了很好的解释(据我认为是正确的),在这里我将对其进行总结以确保完整性。请注意,UTF-16和UTF-32具有字节序变体。 UTF-32,UTF-32LE,UTF-32BE 最简单的编码,每个代码点仅以等于其数值的4个字节进行编码。LE / BE表示字节序(小字节序/大字节序)。 UTF-16,UTF-16LE,UTF-16BE 来自的代码点U+0000 - U+FFFF以等于其数值的2个字节编码。较大的值使用一对代理进行编码,这些代理是的保留值U+D800 - U+DFFF。因此,要编码大于的点U+FFFF,可以使用以下算法(从Wikipedia中无耻地复制): 从代码点减去0x010000,剩下20位数字,范围为0..0x0FFFFF。 最高的十个位(0..0x03FF范围内的数字)被添加到0xD800,以给出第一个代码单元或前导代理,其范围为0xD800..0xDBFF [...]。 低十位(也位于0..0x03FF范围内)添加到0xDC00,以提供第二个代码单元或尾迹替代,其范围为0xDC00..0xDFFF [...]。 UTF-8 来自的代码点U+0000 - U+007F被编码为等于其数值的1个字节。从U+0080 - U+07FF他们被编码为110xxxxx 10xxxxxx,U+0800 - U+FFFF是1110xxxx 10xxxxxx 10xxxxxx,值越大11110xxx 10xxxxxx 10xxxxxx 10xxxxxx。所述x的是从代码点的数值的位。 物料清单 …