如果想区分一个完整的字符串是 GBK 还是 UTF8 其实蛮简单的。虽然做不到 100% 有效,但也比上面的方法强许多。
UTF8 是兼容 ascii 的,所以 0~127 就和 ascii 完全一致了。
gbk 的第一字节是高位为 1 的,第 2 字节可能高位为 0 。这种情况一定是 gbk ,因为 UTF8 对 >127 的编码一定每个字节高位为 1 。
另外,对于中文,UTF8 一定编码成 3 字节。(似乎亚洲文字都是,UTF8 中双字节好象只用于西方字符集)
所以型如 110***** 10****** 的,我们一概看成 gbk/gb2312 编码。这就解决了“位”的问题。
汉字以及汉字标点(包括日文汉字等),在 UTF8 中一定被编码成:1110**** 10****** 10******
连续汉字数量不是 3 的倍数的 gb2312 编码的汉字字符串一定不会被误认为 UTF8 。用了一些gbk 扩展字,或是插入了一些 ascii 符号的字符串也几乎不会被认为是 UTF8 。
一般说来,只要汉字稍微多几个,gbk 串被误认为 UTF8 的可能性极其低。(只需要默认不使用 UTF8 中双字节表示的字符)可能性低,这里还有另外一个原因。UTF8 中汉字编码的第一个字节是 1110**** ,这处于汉字的 gb2312 中二级汉字(不常用汉字,区码从 11011000 开始)的编码空间。一般是一些生僻字才会碰上。
可用如下代码确认是不是汉字
int isChinese(unsigned char bhead, unsigned char btail)
{
int r=0;
int iHead = bhead & 0xff;
int iTail = btail & 0xff;
if ((iHead>=0x81 && iHead<=0xfe &&
(iTail>=0x40 && iTail<=0x7e || iTail>=0x80 && iTail<=0xfe)) ||
(iHead>=0xa1 && iHead<=0xf7 && iTail>=0xa1 && iTail<=0xfe) ||
(iHead>=0xa1 && iHead<=0xf9 &&
(iTail>=0x40 && iTail<=0x7e || iTail>=0xa1 && iTail<=0xfe)))
{
return 1;
}
return 0;
}
[摘自云风的blog]
分享到:
相关推荐
PHP判断字符串编码是UTF-8还是GB2312的知识点主要包括两部分:一种是使用自定义函数进行判断,另一种是通过正则表达式和iconv函数进行判断。 第一种方法涉及到编写一个函数is_gb2312($str),其逻辑是遍历字符串中每...
在PHP中,默认的字符串是基于UTF-8编码的,这意味着一个中文字符通常由三个或四个字节组成,但`strlen()`仍将其视为一个单一字符。如果字符串使用其他编码(如GBK),则每个中文字符可能占据两个字节。在处理多字节...
由于中文字符通常用两个字节表示,这通常意味着使用了如GB2312、GBK或UTF-8这样的编码标准。由于程序中没有明确说明所使用的字符编码,因此我们只知道中文字符需要两个字节来表示,但不清楚具体使用的是哪种编码。 ...
例如,在UTF-8编码的控制台中,使用UTF-8编码输出的文本可以正确显示,而使用GBK编码则不行。 总结而言,使用PHP进行Unicode到UTF-8的转换主要依赖于`rawurldecode()`和`iconv()`函数,正确处理不同平台上的字节序...
在Symbian操作系统中,处理中文字符串是一项关键任务,尤其对于开发本地化应用程序至关重要。Symbian系统支持多种版本,包括Series 60 (S60) 第二版和第三版,这些版本都需要有效地处理中文字符。下面我们将深入探讨...
在UTF-8编码中,一个中文字符通常由三个字节组成,因此,使用`strlen`函数计算含有中文字符的字符串长度时,每个中文字符会被计作三个字节。 #### mb_strlen函数概述 与`strlen`相比,`mb_strlen`函数更加灵活且...
- **UTF-8编码方案**:UTF-8是一种可变长度的编码方式,对于英文字符等常见字符使用单字节编码,而对于大多数其他字符则使用2至4字节编码。这种方式既节省空间又便于实现。 ##### 1.4 字符集小结 通过对ASCII码表...
由于Python源文件本身是按UTF-8编码的,所以处理中文字符不会出现太多问题,但为了确保Python脚本在不同环境和版本下都能正确处理中文字符,最好在文件的开头声明编码。 对于初学者,了解如何在Python脚本中输出...
在JavaScript中计算字符串长度,尤其是涉及中文字符时,需要区分字符编码格式,如UTF8。这是因为在JavaScript原生length属性中,所有字符都被当作单字节处理,导致中文字符和英文字符长度相同。实际上中文字符在UTF8...
在Java编程语言中,处理字符串是一项常见的任务,尤其是在进行...上述代码提供了一个具体的示例,展示了如何在GBK编码下安全地截取字符串,但开发者也应熟悉其他常见编码(如UTF-8),以便在不同的应用场景中灵活应对。
例如,当你需要将一个UTF-8编码的字符串转换为GBK编码以便在中国大陆地区正确显示时,就需要进行这种转换。 `utf8coder.cpp`和`utf8coder.h`这两个文件很可能是实现UTF-8和多字节编码转换的C++源代码和头文件。在...
编码是字符集与二进制数据之间的转换规则,不同的系统或软件可能默认使用不同的编码格式,如UTF-8、GBK(GB2312的扩展)、UTF-16等。 ### 1. 编码识别与设置 为了解决C#中汉字乱码的问题,关键在于正确识别文件的...
例如,GBK字符集中不包含繁体中文字符,因此如果需要同时存储简体和繁体中文,应选择UTF-8。在不同字符集间进行转换时,可能会导致数据丢失或乱码,因此需谨慎操作。 5. 性能影响 使用不同的字符集和排序规则可能...
例如,UTF-8是一种变长编码,一个汉字可能由1到4个字节组成,而GBK是基于GB2312的扩展,通常每个汉字占2个字节。 提取汉字首字母的关键在于理解汉字与拼音之间的转换。在中文处理中,通常需要将汉字转化为拼音,...
XMLHttpRequest对象的responseText属性返回的是以UTF-8编码的字符串。在项目中,如果服务器返回的数据采用其他编码如GB2312或GBK,可能会导致乱码。通常,开发者会倾向于整个项目统一使用UTF-8编码以简化处理,但...
- **GBK**:包含大部分中文字符,但不支持其他语言。 - **UTF-8**:支持多种语言,包括中文,占用空间相对较大,但兼容性最好。 6. **注意事项**: - 更改字符集可能影响已存储的数据,需谨慎操作。 - 对于多...
Python2.x使用过程中,中文乱码解决最耳熟能详的方法就是在代码前加上#-*- coding:utf-8 –*- 那么为什么需要这么做呢?什么又是字节和字符?下面我们了解下。 我来讲一下字符问题我的理解吧,虽然我对Python的编码...
而在C++源代码中,直接使用中文字符串可能导致编译器不识别或者乱码。 描述中提到的“cppwenjian”可能是指一个C++源文件集合,这个工具只上传了其中的一部分,比如`CheckXmlDlg.cpp`和`CheckXmlDlg.h`。`...
例如,你可以使用`encode`方法将`unicode`字符串编码为特定的字节序列,如GBK或UTF-8;反之,使用`decode`方法将字节序列解码回`unicode`字符串。 图1展示了Python交互式解释器模式下,从外部输入的Unicode字符串...
例如,当你从一个使用GBK编码的文本文件读取内容并将其保存为UTF-8格式时,就需要进行Unicode转换。同样,在开发跨平台的应用程序时,确保数据在不同系统间以Unicode格式交换也是至关重要的。 在编程中,Python提供...