0

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

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

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

我需要一些帮助。

谢谢

4

3 回答 3

1

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

802.11 规范没有说明如果未启用 UTF-8 SSID 功能应如何解释字符,但我怀疑这通常意味着只有 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 包含超出该范围的字符,您可能无法使其正常工作。

于 2013-05-23T18:27:52.157 回答
1

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

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

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

于 2013-05-23T16:55:21.797 回答
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

于 2013-05-23T13:43:25.833 回答