BOM(Byte Order Mark)是一个字符,它表明UNICODE文本的UTF-16,UTF-32的编码字节顺序(高字节低字节顺序)和编码方式(UTF-8,UTF-16,UTF-32, 其中UTF-8编码是字节顺序无关的)。
如下所示:
Encoding Representation
UTF-8 EF BB BF
UTF-16 Big Endian FE FF
UTF-16 Little Endian FF FE
UTF-32 Big Endian 00 00 FE FF
UTF-32 Little Endian FF FE 00 00
有些utf8编码没有这个BOM,该怎么区分了,是utf8还是ansi(根本就没有BOM这个东西),下面先了解下utf8:
UTF-8是UNICODE的一种变长字符编码,由Ken Thompson于1992年创建。现在已经标准化为RFC 3629。UTF-8用1到6个字节编码UNICODE字符。如果UNICODE字符由2个字节表示,则编码成UTF-8很可能需要3个字节,而如果UNICODE字符由4个字节表示,则编码成UTF-8可能需要6个字节。用4个或6个字节去编码一个UNICODE字符可能太多了,但很少会遇到那样的UNICODE字符。
UFT-8转换表表示如下:
UNICODE UTF-8
00000000 - 0000007F 0xxxxxxx
00000080 - 000007FF 110xxxxx 10xxxxxx
00000800 - 0000FFFF 1110xxxx 10xxxxxx 10xxxxxx
00010000 - 001FFFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
00200000 - 03FFFFFF 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
04000000 - 7FFFFFFF 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
实际表示ASCII字符的UNICODE字符,将会编码成1个字节,并且UTF-8表示与ASCII字符表示是一样的。所有其他的UNCODE字符转化成UTF-8将需要至少2个字节。
以上是网上找的utf8编码介绍,对于这个转换表可以看作一个模板,对于以标示的二进制位值是固定的,XX位是将字符以unicode编码,然后根据值的大小分段,决定使用哪个模板,高位在前的次序填入XX位.
ascii占用一个字节,一般我们见到的其它字符都是占用3个字节,套用00000800 - 0000FFFF 1110xxxx 10xxxxxx 10xxxxxx这个模板,这样第一个字节就是>=11100000(&HE0) and < 11110000(&HF0),后面两个字节>=10xxxxxx(&H80) and < 11000000(&HC0),我们就可以根据这点来写代码了,符合这个规则的都被判为utf8,否则为ansi.
VB.net代码如下:
Function OnUtf8(ByVal byts() As Byte) As Boolean
Try
Dim i As Int32, AscN As Int32
Do While i <= UBound(byts)
If byts(i) < 128 Then
i += 1 'ascii字符
AscN += 1
ElseIf (byts(i) And &HE0) = &HC0 And (byts(i + 1) And &HC0) = &H80 Then
i += 2 '2个字节的utf8
ElseIf (byts(i) And &HF0) = &HE0 And (byts(i + 1) And &HC0) = &H80 And (byts(i + 2) And &HC0) = &H80 Then
i += 3 '3个字节的utf8
Else
Return False
End If
Loop
'这个判断可以不要,当全部是ascii字符时,被划分到哪种编码
If AscN = byts.Length Then
Return False
Else
Return True
End If
Catch ex As Exception
'MsgBox(ex.Message)
End Try
End Function
这种判断法,一般的字符都可以正确判断,可踫上特殊的就会变成乱码,像比较普通的"联通"两个字,还有"戟半丁","戟广发"等等,像这种组合正好落在这个判断内就会把本来的ansi编码识别为utf8,从而变成乱码,系统自带的记事本用的判断法应该和这个差不多,对于以上的特殊字眼用ansi编码保存后,再打开同样是乱码,为什么要让无BOM的utf8编码存在了,虽然这种情况很少见.
分享到:
相关推荐
标题中的“无头BOM的UTF8文件判断”是指在处理UTF-8编码的文本文件时,关注那些没有字节顺序标记(Byte Order Mark,简称BOM)的文件。BOM是一个可选的Unicode签名,通常出现在文件的开头,用于标识文件采用的字符...
例如,可以使用`ZipInputStream`遍历压缩包中的所有条目,对每个条目读取其内容并进行编码判断。 总之,通过引入第三方库,我们可以方便地在Java中检测文件的编码并检查是否存在BOM。这在处理不同编码格式的文件时...
本资源主要关注如何判断一个文本文件是否采用UTF-8编码。 在Windows系统中,比如Windows 7旗舰版,我们经常使用Notepad.exe(记事本)来查看和编辑文本文件。在编程环境中,有时候我们需要编写代码来检查文件的编码...
这个过程可能涉及到字节顺序标记(BOM)的处理,BOM在某些UTF-8文件的开头用以标识其编码类型,但在其他情况下可以省略。 使用此类工具时,用户需要注意一些问题。首先,如果源文件的编码格式判断错误,转换结果...
在编程领域,特别是涉及到PHP和文本编码的时候,"BOM"是一个重要的概念。BOM是Byte Order Mark的缩写,中文可译为...同时,这也提醒我们在编写和存储代码时,应尽量选择无BOM的UTF-8编码,以减少潜在的兼容性问题。
C# 文件字符编码识别,识别 ASCII、UTF8、UTF16、UTF32 编码,包含是否 BOM 标记,不管文件头是否存在 BOM 标记,都能准确识别。
2. **字节顺序标记(BOM)**:UTF8可以选择包含一个可选的字节顺序标记(Byte Order Mark, BOM),即` EF BB BF `,这在文件开始时出现,用来标识数据的编码方式。不过,很多UTF8文件不包含BOM,因为它是可选的,...
UTF-8的全称是“8位无符号字符转换格式”(UCS Transformation Format - 8 bit)。每个Unicode字符在UTF-8中可以由1到4个字节表示。简单来说,对于ASCII字符(包括英文、数字和一些特殊符号),UTF-8编码与ASCII...
如果文件没有BOM,我们需要进一步检查字节序列,因为UTF-8编码的文件在无BOM的情况下也可能通过其字节模式来识别。 3. **分析字节模式**:对于没有BOM的UTF-8文件,我们需要检查每个字符的字节模式。UTF-8编码的...
在 Windows 系统下,文本文件编码存在有无 ...有文件 BOM 头的 Unicode 编码容易识别,无 BOM 文件头的要在文件中查找字节顺序来判断 Unicode 编码。 识别 UTF32、UTF16、UTF8 后,就是 ASCII 文件与简体中文编码识别。
本文将探讨如何使用Java进行文件编码格式的识别,主要介绍两种方法:一种是简单的UTF-8判断,另一种是使用开源库cpdetector。 首先,对于简单的UTF-8编码格式判断,我们可以直接读取文件的前三个字节来确定。UTF-8...
Java源码编码转换器是一款实用工具,主要用于将Java源代码文件从GBK编码转换为UTF-8编码,或者从UTF-8编码转换为GBK编码。在软件开发过程中,尤其是在处理中文字符时,编码问题是一个常见的挑战。GBK是中文环境下...
这可能需要一些预处理,例如检查BOM(Byte Order Mark)或根据文件的元信息来判断。 2. **解码**:将原始编码的数据解码成Unicode字符数组。对于GBK,你可以使用第三方库,如iconv或Windows API中的...
本文将详细介绍如何使用Java来判断文件是否为UTF-8或GBK编码,并提供一个示例代码。 #### 文件编码基础知识 1. **UTF-8**:一种可变长度的字符编码,适用于所有Unicode字符,它通过使用一种巧妙的方案来表示各种...
- 分析编码:程序需要检测输入文本的原始编码,这通常通过检查字节序列的特定模式来判断,如BOM(Byte Order Mark)标记。 - 转换过程:一旦识别出原始编码,程序将按照该编码解码文本,然后使用UTF-8编码重新编码。...
熊猫看书作为一款阅读软件,能自动识别包括GBK、UTF8、UTF-16LE、UTF-16BE和BIG5在内的五种中国地区常见编码格式,从而确保用户能够顺利阅读各种类型的电子书。 对于含有BOM的TXT文件,识别编码相对简单。BOM位于...
但如果你不想读取BOM,可以创建一个无BOM的UTF-8编码对象: ```vb.net Dim encoding As Encoding = New UTF8Encoding(False) ``` 除了使用`StreamReader`,还可以使用`File.ReadAllText`或`File.ReadAllLines`方法...
编码判断逻辑 如果字符串的第一个字节小于0xEF,则认为该字符串使用的是默认编码;否则继续进行BOM检测,并根据检测结果返回相应的编码类型。 ```cpp if(ss[0] >= 0xEF) { if (ss[0] == 0xEF && ss[1] == 0xBB &...
另一种是无BOM的UTF8,没有这三个特定的字节。而GB2312和Unicode(UTF-16LE)则有各自的BOM标志,GB2312没有BOM,但UTF-16LE的BOM是0xFE, 0xFF,而UTF-16BE(大端序)的BOM是0xFF, 0xFE。 接下来,我们来看提供的...
许多编码格式,如UTF-8、UTF-16,会在文件开始处放置一个BOM标志。通过检查这个标志,可以快速确定编码类型。例如,UTF-8的BOM是`EF BB BF`。 ```java public static String detectEncodingByBom(InputStream is...