C字符串编码没有libiconv的UTF8

时间:2013-05-23 12:43:28

标签: c string utf-8 character-encoding uclibc

我知道大多数语言已经回答了这个问题,但我没有找到C的解决方案,或者我误解了一些东西。

我已声明“char * strSSID”。我在Web服务器中有一个函数来处理表单页面的POST参数。此函数在“srtSSID”中返回一个名为SSID的参数,用于配置无线的SSID名称。但问题是SSID中的特殊字符如“ñ”在Linux中正常显示,而我的手机或Windows则像奇怪的字符一样。

我知道问题是编码。在我的平台(mips和uclibc库)中,像'ñ'这样的特殊字符存储在两个位置(我的意思是例如“srtSSID [0]”和“strSSID [1]”来存储SSID的第一个'ñ'字符)strSSID。

我需要一些帮助。

谢谢

3 个答案:

答案 0 :(得分:1)

确保在所有设备中正确显示字符的唯一方法是使用以ASCII格式显示的字符,因为(我认为您已经确定),您将无法强制Windows等将其解释为UTF -8。您的问题是诸如'ñ'之类的字符不会出现在ASCII中,因此您无法将带有此类字符的unicode字符串转换为标准ASCII。

前128个UTF-8字符与ASCII相同,因此不需要对字符串进行翻译......但是您需要删除或替换任何值大于127的字符。

如果你可能使用的所有设备都使用相同的非英语默认语言,那么可能就是它们都使用相同的扩展ASCII版本(严格来说,ASCII是7-位代码,但大多数实现使用顶部位添加另外128个字符,通常包括重音字符,并且通常依赖于设备的默认语言)。我虽然在这里猜测!当然,扩展的ASCII字符集不太可能与假定SSID为UTF-8的设备兼容!

答案 1 :(得分:1)

为了在SSID中使用UTF-8字符,802.11规范要求需要设置扩展功能元素的UTF-8 SSID子字段。如果您发现UTF-8 SSID在某些设备上不起作用,则可能是他们没有正确设置扩展功能元素,或者他们可能不支持该功能。

如果没有启用UTF-8 SSID功能,802.11规范没有说明如何解释字符,但我怀疑这通常意味着只有ASCII字符有效,在这种情况下你的ñ是永远不会工作。

也就是说,转换为Latin1可能会取得一些成功。如果您无权访问将执行字符集转换的库,那么这里的基本转换函数应该足以满足您的需求。

void utf8tolatin1(char *s) {
  size_t i = 0, j = 0;
  char c;
  do {
    c = s[i++];
    if ((c&0xFC) == 0xC0 && s[i])
      c = (c<<6) + (s[i++]&0x3F);
    s[j++] = c;
  } while(c != 0);
}

请注意,这仅转换Latin1范围内的UTF-8字符 - 其他所有字符都保留原样。如果您的SSID包含该范围之外的字符,则可能无法执行任何操作。

答案 2 :(得分:0)

如果您通过网页发布此内容,则必须确保页面声明的编码确实是utf-8。有几种方法可以实现这一目标:

  • 在回复中使用Content-Type标头:Content-Type: text/html; charset=UTF-8
  • 在HTML页面中使用元标记。这取决于您使用的HTML版本。在HTML 4中,它是<meta http-equiv="Content-type" content="text/html;charset=UTF-8">

浏览器配置为采用不同的编码默认值,因此可能的解释是您的Windows浏览器需要ISO-8859-1编码。

有关如何声明编码的更多说明,请参阅此w3c页面:http://www.w3.org/International/questions/qa-html-encoding-declarations