UTF-8 是一种利用第 8 位对非 ASCII(7 位代码)使用多个字节的编码。因此,您不会在多字节序列中找到'\'
, 。'/'
并且isdigit
有效(尽管不是阿拉伯语和其他数字)。
它是 ASCII 的超集,可以容纳所有 Unicode 字符,因此绝对要与 char 和 string 一起使用。
检查 HTTP 标头(不区分大小写);它们在 ISO-8859-1 中,在空行之前,然后是 HTML 内容。
Content-Type: text/html; charset=UTF-8
如果不存在,也可能存在
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta charset="UTF-8"> <!-- HTML5 -->
ISO-8859-1 是拉丁语 1,您最好从 Windows-1252 转换,Windows 拉丁语 1 扩展使用 0x80 - 0xBF 用于逗号引号等一些特殊字符。尽管指定了 ISO-8859-1,但即使 MacOS 上的浏览器也能理解这些。
转换库:@syam 已经提到。
转换
我们不考虑 UTF-16。可以读取标题并开始直到字符集的元语句作为单字节字符。
从单字节编码到 UTF-8 的转换可以通过表格进行。例如用 Java 生成的:aconst char* table[]
由 char 索引。
table[157] = "\xEF\xBF\xBD";
public static void main(String[] args) {
final String SOURCE_ENCODING = "windows-1252";
byte[] sourceBytes = new byte[1];
System.out.println(" const char* table[] = {");
for (int c = 0; c < 256; ++c) {
String comment = "";
System.out.printf(" /* %3d */ \"", c);
if (32 <= c && c < 127) {
// Pure ASCII
if (c == '\"' || c == '\\')
System.out.print("\\");
System.out.print((char)c);
} else {
if (c == 0) {
comment = " // Unusable";
}
sourceBytes[0] = (byte)c;
try {
byte[] targetBytes = new String(sourceBytes, SOURCE_ENCODING).getBytes("UTF-8");
for (int j = 0; j < targetBytes.length; ++j) {
int b = targetBytes[j] & 0xFF;
System.out.printf("\\x%02X", b);
}
} catch (UnsupportedEncodingException ex) {
comment = " // " + ex.getMessage().replaceAll("\\s+", " "); // No newlines.
}
}
System.out.print("\"");
if (c < 255) {
System.out.print(",");
}
System.out.println();
}
System.out.println(" };");
}