如何将字符串从给定的编码转换为其他编码?

时间:2014-08-06 13:06:00

标签: character-encoding iconv

我不会编写任何在不同字符编码之间转换文本的软件。 iconv存在。我很想知道在阅读this excellent tutorial字符编码时如何做到这一点。因为,不同编码中的角色将具有不同的代码点,对我来说似乎没有自动的方法来做到这一点,我的意思是没有任何人为干预。希望OCR不是这样做的方法:P。

为了澄清,我们假设我们有一个字符串“Yahoo!”它在UTF-8中的编码是E。拉丁语-1中的E'编码也是“雅虎”?此外,我采取的例子似乎很简单。如何为一般字符串执行此操作?

1 个答案:

答案 0 :(得分:4)

正如优秀教程的优秀作者所写( * cough * cough * ):

  

编码之间的转换是比较两个代码页并决定编码A中的字符152与编码B中的字符4122相同,然后相应地改变位的繁琐任务。

它实际上是将一个编码映射到另一个编码的麻烦表的页面和页面。例如,来自iconv source code

static const unsigned short cp950_2uni_pagea1[314] = {
  /* 0xa1 */
  0x3000, 0xff0c, 0x3001, 0x3002, 0xff0e, 0x2027, 0xff1b, 0xff1a,
  0xff1f, 0xff01, 0xfe30, 0x2026, 0x2025, 0xfe50, 0xfe51, 0xfe52,
  0x00b7, 0xfe54, 0xfe55, 0xfe56, 0xfe57, 0xff5c, 0x2013, 0xfe31,
  0x2014, 0xfe33, 0x2574, 0xfe34, 0xfe4f, 0xff08, 0xff09, 0xfe35,
  0xfe36, 0xff5b, 0xff5d, 0xfe37, 0xfe38, 0x3014, 0x3015, 0xfe39,
  0xfe3a, 0x3010, 0x3011, 0xfe3b, 0xfe3c, 0x300a, 0x300b, 0xfe3d,
  0xfe3e, 0x3008, 0x3009, 0xfe3f, 0xfe40, 0x300c, 0x300d, 0xfe41,
  0xfe42, 0x300e, 0x300f, 0xfe43, 0xfe44, 0xfe59, 0xfe5a, 0xfe5b,
  0xfe5c, 0xfe5d, 0xfe5e, 0x2018, 0x2019, 0x201c, 0x201d, 0x301d,
  0x301e, 0x2035, 0x2032, 0xff03, 0xff06, 0xff0a, 0x203b, 0x00a7,
  0x3003, 0x25cb, 0x25cf, 0x25b3, 0x25b2, 0x25ce, 0x2606, 0x2605,
  0x25c7, 0x25c6, 0x25a1, 0x25a0, 0x25bd, 0x25bc, 0x32a3, 0x2105,
  0x00af, 0xffe3, 0xff3f, 0x02cd, 0xfe49, 0xfe4a, 0xfe4d, 0xfe4e,
  0xfe4b, 0xfe4c, 0xfe5f, 0xfe60, 0xfe61, 0xff0b, 0xff0d, 0x00d7,
  0x00f7, 0x00b1, 0x221a, 0xff1c, 0xff1e, 0xff1d, 0x2266, 0x2267,
  0x2260, 0x221e, 0x2252, 0x2261, 0xfe62, 0xfe63, 0xfe64, 0xfe65,
  0xfe66, 0xff5e, 0x2229, 0x222a, 0x22a5, 0x2220, 0x221f, 0x22bf,
  0x33d2, 0x33d1, 0x222b, 0x222e, 0x2235, 0x2234, 0x2640, 0x2642,
  0x2295, 0x2299, 0x2191, 0x2193, 0x2190, 0x2192, 0x2196, 0x2197,
  0x2199, 0x2198, 0x2225, 0x2223, 0xff0f,
  ...

通常将每个可能的编码映射到Unicode是有意义的。由于Unicode可以表示所有可能的字符,因此您可以编码A→Unicode→编码B ,而无需在所有可能的编码组合之间建立转换表(这将是 n ²而且非常荒谬)。没有一般的程序捷径。有些编码比其他编码更容易映射到Unicode,因此您可以为这些编码提供一些非常短的代码,但所有其他编码只需要手动调整。

请注意,至少部分源代码可能是从现有来源生成的;我怀疑所有这些表都是手写的。尽管如此,有人不得不在某个时候写一些查找表。