to unsigned 这个不算是记事本的BUG因为 记事本不是 “否则就直接当ANSI文件处理”而是因为记事本判断utf8 默认的判断方式是 看文件头几个字节的值的 110xxxxx 10xxxxxx 关键是这5个位 联通的ASCII码是 C1 AA CD A8 即 11000001 10101010 11001101 10101000 运气很不好的 全部满足了 附 Unicode编码和utf-8编码之间的对应关系表 The table below summarizes the format of these different octet types. The letter x indicates bits available for encoding bits of the character number. Char. number range | UTF-8 octet sequence (hexadecimal) | (binary) --------------------+--------------------------------------------- 0000 0000-0000 007F | 0xxxxxxx 0000 0080-0000 07FF | 110xxxxx 10xxxxxx 0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx //////A///////// 0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 这是一个Unicode编码和utf-8编码之间的对应关系表。中文的Unicode编码范围在0000 0800-0000 FFFF 中。
to unsigned 这个不算是记事本的BUG ======================= 个人观点不同罢了。
Dim TempFile As Long Dim LoadBytes() As Byte '以二进制读入文件内容 TempFile = FreeFile Open FilePath For Binary As #TempFile ReDim LoadBytes(1 To LOF(TempFile)) As Byte Get #TempFile, , LoadBytes Close TempFile
'On Error GoTo NoEncoding Dim i As Integer, FileCharset As String, strFileHead As String '从二进制流中分析文件头的编码信息 For i = 1 To 3 strFileHead = strFileHead & Hex(LoadBytes(i)) Next '判断文件采用了何种编码 If strFileHead = "EFBBBF" Then '前3个byte如果为 EF BB BF 则表示为 UTF-8编码 FileCharset = "UTF-8" Else strFileHead = Left(strFileHead, 4) If strFileHead = "FEFF" Then '此时为 unicode big endian 编码 FileCharset = "unicodeFFFE" ElseIf strFileHead = "FFFE" Then '此时为 unicode 编码 FileCharset = "UNICODE" Else '否则默认为普通简体中文 GB2312 '你如果知道其它编码的格式还可以继续的分析判断! FileCharset = "GB2312" End If End If
UTF8前三个字节为(即BOM):&hEF、&hBB、&hBF
Unicode前两个字节为:&hFF、&hFE
Unicode Swap前两个字节为:&hFE、&hFF
===========================
呵呵,那偶就更不熟悉了^_^
偶只用Delphi/C++做过。
这句是错的
如果是这样的话 就不会有
WINXP下
在记事本输入“联通” 保存以后 再打开变成乱码的问题了
这句是错的
如果是这样的话 就不会有
WINXP下
在记事本输入“联通” 保存以后 再打开变成乱码的问题了
===================================================
在这个问题上面没有对或者错误的说法,也曾有人说这是记事本的BUG,这又如何解释?要知道一个文件弄不好几就是上百兆以上,难不成一个个字符进行检测?那么就需要首先检测是否为文本文件,而这文本文件又如何检测法呢?对于Unicode和ANSI很显明的有差别,不是么?
换句话说经这编码当中不仅有以上几种编码,还有UTF7也是一种标准编码,而这种编码不常用,也没有BOM。
这个不算是记事本的BUG因为 记事本不是 “否则就直接当ANSI文件处理”而是因为记事本判断utf8 默认的判断方式是
看文件头几个字节的值的 110xxxxx 10xxxxxx 关键是这5个位
联通的ASCII码是 C1 AA CD A8 即 11000001 10101010 11001101 10101000
运气很不好的 全部满足了
附
Unicode编码和utf-8编码之间的对应关系表
The table below summarizes the format of these different octet types.
The letter x indicates bits available for encoding bits of the
character number. Char. number range | UTF-8 octet sequence
(hexadecimal) | (binary)
--------------------+---------------------------------------------
0000 0000-0000 007F | 0xxxxxxx
0000 0080-0000 07FF | 110xxxxx 10xxxxxx
0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx //////A/////////
0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
这是一个Unicode编码和utf-8编码之间的对应关系表。中文的Unicode编码范围在0000 0800-0000 FFFF 中。
这个不算是记事本的BUG
=======================
个人观点不同罢了。
Dim LoadBytes() As Byte
'以二进制读入文件内容
TempFile = FreeFile
Open FilePath For Binary As #TempFile
ReDim LoadBytes(1 To LOF(TempFile)) As Byte
Get #TempFile, , LoadBytes
Close TempFile
'On Error GoTo NoEncoding
Dim i As Integer, FileCharset As String, strFileHead As String
'从二进制流中分析文件头的编码信息
For i = 1 To 3
strFileHead = strFileHead & Hex(LoadBytes(i))
Next
'判断文件采用了何种编码
If strFileHead = "EFBBBF" Then
'前3个byte如果为 EF BB BF 则表示为 UTF-8编码
FileCharset = "UTF-8"
Else
strFileHead = Left(strFileHead, 4)
If strFileHead = "FEFF" Then
'此时为 unicode big endian 编码
FileCharset = "unicodeFFFE"
ElseIf strFileHead = "FFFE" Then
'此时为 unicode 编码
FileCharset = "UNICODE"
Else
'否则默认为普通简体中文 GB2312
'你如果知道其它编码的格式还可以继续的分析判断!
FileCharset = "GB2312"
End If
End If