我正在使用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] 删除。
我来说两句