如题,最近做的项目需要调用科大讯飞的语音合成接口,将日文合成日语。然后坑爹的是跟我对接的那一方直接扔过来一份接口文档,里面并未提及日语合成所需要的参数。中文、英文合成倒是没问题,就这个日语合成的音频始终听起来不对。后来对接方说文本需要unicode编码,但具体如何编码他们也不清楚。这回至少有了思路,就拿文本做各种unicode编码。随后试来试去,好歹给试出来了是哪种unicode编码。这次天坑也算是知道了些unicode的皮毛。
Unicode,全称Universal Multiple-Octet Coded Character Set,通用多八位编码字符集,它是一套字符集,也是一套编码方案。字符我们知道,比如“中”就是一个字符,那啥是字符编码?字符编码是给计算机识别字符用的。计算机只知道0和1,比如“中”要让计算机表示出来,就必须将它转换为0和1,怎么转的就是字符编码搞定的。既然提到字符编码,离不开字符集,因为字符编码又是通过字符集来实现的。
字符集就是字符的集合,比如美国人制定的ASCII字符集包含了256个字符,用来表示英文字母、数字、标点符号、控制符等,而国人则制定了中文字符集GB2312,以及它的进化版GBK、GB18030。那么问题来,ASCII是单字节(8位),撑死了表示256个字符;GB2312、GBK是双字节,虽说能耐大些,也就撑死了表示65536个字符;GB18030已经增加到四字节了,但其他国家怎么办呢?它们不见得乐意用咱们的GB系列,都自立为王搞一套,那就都乱套了。为了能一劳永逸的解决字符集的问题,国际标准组织出手了,它搞出了一套四字节编码的字符集,包罗万象,管你英文还是中文,日文还是韩文,世界上所有语言的字符它大小通吃。
Unicode如此霸气侧漏,但我们需要注意一下,它不是一个具体的字符集,而是一套字符集,包括UTF-8、UTF-16、UTF-32等,这些字符集合起来就是一套编码方案。UTF,全称Unicode Transformation Format,如果是以8位(单字节)进行编码,就是UTF-8,同理,以双字节(16位)编码就是UTF-16,四字节就是UTF-32。Unicode的“字符”就是编码点(code point),通常写成 16 进制的形式再加前缀“U+
”,例如“中”的编码点是U+4e2d。UTF-32空间开销太多,用的并不多。其实Unicode默认用的是UTF-16。最常用的是 UTF-8 ,它根据不同的字符进行不同的编码,可变的存储为 1 到 4 个字节,空间开销最小。
UTF-8单字节不存在字节序列问题,UTF-16、UTF-32就需要注意大小端点问题了。具体用个例子来说明比说一堆废话好理解,比如现在我用UTF-16表示“中”这个字符,因为有两个字节,那么这两个字节哪个先出现呢?大端点的编码点表示是U+4e2d,小端点的编码点则为:U+2d4e。Unicode默认使用一个BOM(Byte Order Mark,字节序列标记 )来让计算