如何在C ++中将ISO-8859-7字符串“转换”为UTF-8?

阿菲

我正在使用10多年以上的旧机器,这些机器使用ISO 8859-7来表示希腊字符,每个字符使用一个字节。我需要捕获这些字符并将其转换为UTF-8,以便将它们注入通过HTTPS发送的JSON中。另外,我使用的是GCC v4.4.7,我不想升级,所以不能使用codeconv等。

示例:“OΛΑ”:我得到char值[ 0xcf, 0xcb, 0xc1, ],我需要写这个字符串"\u039F\u039B\u0391"

PS:我不是字符集专家,所以请避免出现哲学上的回答,例如“ ISO 8859是Unicode的子集,因此您只需要实现算法”即可。

阿菲

好的,我决定自己做,而不是寻找兼容的库。这是我的做法。

主要问题是弄清楚如何使用ISO的单个字节来填充Unicode的两个字节,因此我使用调试器读取相同字符的值,首先由旧机器编写,然后以常量字符串(UTF)编写。默认为-8)。我从“ O”和“Π”开始,发现在UTF-8中,第一个字节始终为0xCE,而第二个字节则是ISO值加上偏移量(-0x30)。我构建了以下代码来实现此目的,并使用了一个包含所有希腊字母(大写和小写)的测试字符串。然后我意识到,从“π”(ISO中的0xF0)开始,第一个字节和第二个字节的偏移都发生了变化,因此我添加了一个测试以找出要应用这两个规则中的哪一个。以下方法返回布尔值,以使调用者知道原始字符串是否包含ISO字符(可用于其他目的),并用新的覆盖作为参考传递的原始字符串。我使用char数组而不是字符串来与项目的其余部分保持一致,该项目基本上是一个用C ++编写的C项目。

bool iso_to_utf8(char* in){
bool wasISO=false;

if(in == NULL)
    return wasISO;

// count chars
int i=strlen(in);
if(!i)
    return wasISO;

// create and size new buffer
char *out = new char[2*i];
// fill with 0's, useful for watching the string as it gets built
memset(out, 0, 2*i);

// ready to start from head of old buffer
i=0;
// index for new buffer
int j=0;
// for each char in old buffer
while(in[i]!='\0'){
    if(in[i] >= 0){
        // it's already utf8-compliant, take it as it is
        out[j++] = in[i];
    }else{
        // it's ISO
        wasISO=true;
        // get plain value
        int val = in[i] & 0xFF;
        // first byte to CF or CE
        out[j++]= val > 0xEF ? 0xCF : 0xCE;
        // second char to plain value normalized
        out[j++] = val - (val > 0xEF ? 0x70 : 0x30);
    }
    i++;
}
// add string terminator
out[j]='\0';
// paste into old char array
strcpy(in, out);

return wasISO;

}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在Ruby 2.0中将UTF-8转换为ISO-8859-1?

来自分类Dev

如何将ISO-8859-1字符正确替换为UTF-8?

来自分类Dev

在href中将UTF-8字符集更改为ISO / IEC 8859-2:1999

来自分类Dev

Javascript将字符串从utf-8转换为iso-8859-1

来自分类Dev

如何在PHP中将UTF-8字符串转换为HEX代码点?

来自分类Dev

在Delphi中将UTF8转换为ANSI(ISO-8859-1)

来自分类Dev

如何在Java中将二进制字符串转换为UTF-8字符串?

来自分类Dev

如何在Notepad ++中将文件的编码转换为ISO-8859-1?

来自分类Dev

Nginx:UTF-8字符集而不是ISO-8859-1

来自分类Dev

如何在Ruby中将UCS-2字节数组转换为UTF-8字符串?

来自分类Dev

从UTF8转换为ISO 8859-5,改为获取ISO 8859-1

来自分类Dev

如何从C中的八进制ISO-8859-1转储utf8

来自分类Dev

如何将 iso8859_6 中的文件名转换为 utf-8?

来自分类Dev

使用Dart语言将字符串从ISO-8859-2转换为UTF-8

来自分类Dev

使用Dart语言将字符串从ISO-8859-2转换为UTF-8

来自分类Dev

Ruby将字符串编码从ISO-8859-1转换为UTF-8无效

来自分类Dev

PHP 恢复损坏的非英文字符串(iso 8859-1)为 utf-8

来自分类Dev

字符编码问题-UTF8 / iso-8859-1

来自分类Dev

如何使用javascript创建可能包含每个ISO / IEC 8859-1字符的字符串?

来自分类Dev

如何在C#中将UTF-8转换为字符串

来自分类Dev

如何在C#中将字符串(ASCII类型)转换为UTF-8

来自分类Dev

UTF-8和ISO 8859-9

来自分类Dev

如何在Swift中将字符串转换为unicode(UTF-8)字符串?

来自分类Dev

Symfony2 + Doctrine:如何将iso8859-1转换为utf-8,反之亦然?

来自分类Dev

在javascript中将utf-8字符串转换为Windows-1250

来自分类Dev

从ISO-8859-1转换大型XML为UTF-8与外部DTD实体

来自分类Dev

从 Linux 终端将 ISO-8859-7 转换为 utf-8 而无需 bom

来自分类Dev

DB是iso-8859-1,使用utf8_encode字符获取错误的转换

来自分类Dev

从浏览器发布的字符编码为“ iso-8859-1”,但应为“ UTF-8”

Related 相关文章

  1. 1

    如何在Ruby 2.0中将UTF-8转换为ISO-8859-1?

  2. 2

    如何将ISO-8859-1字符正确替换为UTF-8?

  3. 3

    在href中将UTF-8字符集更改为ISO / IEC 8859-2:1999

  4. 4

    Javascript将字符串从utf-8转换为iso-8859-1

  5. 5

    如何在PHP中将UTF-8字符串转换为HEX代码点?

  6. 6

    在Delphi中将UTF8转换为ANSI(ISO-8859-1)

  7. 7

    如何在Java中将二进制字符串转换为UTF-8字符串?

  8. 8

    如何在Notepad ++中将文件的编码转换为ISO-8859-1?

  9. 9

    Nginx:UTF-8字符集而不是ISO-8859-1

  10. 10

    如何在Ruby中将UCS-2字节数组转换为UTF-8字符串?

  11. 11

    从UTF8转换为ISO 8859-5,改为获取ISO 8859-1

  12. 12

    如何从C中的八进制ISO-8859-1转储utf8

  13. 13

    如何将 iso8859_6 中的文件名转换为 utf-8?

  14. 14

    使用Dart语言将字符串从ISO-8859-2转换为UTF-8

  15. 15

    使用Dart语言将字符串从ISO-8859-2转换为UTF-8

  16. 16

    Ruby将字符串编码从ISO-8859-1转换为UTF-8无效

  17. 17

    PHP 恢复损坏的非英文字符串(iso 8859-1)为 utf-8

  18. 18

    字符编码问题-UTF8 / iso-8859-1

  19. 19

    如何使用javascript创建可能包含每个ISO / IEC 8859-1字符的字符串?

  20. 20

    如何在C#中将UTF-8转换为字符串

  21. 21

    如何在C#中将字符串(ASCII类型)转换为UTF-8

  22. 22

    UTF-8和ISO 8859-9

  23. 23

    如何在Swift中将字符串转换为unicode(UTF-8)字符串?

  24. 24

    Symfony2 + Doctrine:如何将iso8859-1转换为utf-8,反之亦然?

  25. 25

    在javascript中将utf-8字符串转换为Windows-1250

  26. 26

    从ISO-8859-1转换大型XML为UTF-8与外部DTD实体

  27. 27

    从 Linux 终端将 ISO-8859-7 转换为 utf-8 而无需 bom

  28. 28

    DB是iso-8859-1,使用utf8_encode字符获取错误的转换

  29. 29

    从浏览器发布的字符编码为“ iso-8859-1”,但应为“ UTF-8”

热门标签

归档