我知道大多数语言已经回答了这个问题,但我没有找到C的解决方案,或者我误解了一些东西。
我已声明“char * strSSID”。我在Web服务器中有一个函数来处理表单页面的POST参数。此函数在“srtSSID”中返回一个名为SSID的参数,用于配置无线的SSID名称。但问题是SSID中的特殊字符如“ñ”在Linux中正常显示,而我的手机或Windows则像奇怪的字符一样。
我知道问题是编码。在我的平台(mips和uclibc库)中,像'ñ'这样的特殊字符存储在两个位置(我的意思是例如“srtSSID [0]”和“strSSID [1]”来存储SSID的第一个'ñ'字符)strSSID。
我需要一些帮助。
谢谢
答案 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
<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