精华内容
下载资源
问答
  • utf8 utf16 utf16le utf16be

    2013-09-17 21:58:00
    [Charset]UTF-8, UTF-16, UTF-16LE, UTF-16BE的区别最近遇到的麻烦事charset里的问题, 一般我们都用unicode来作为统一编码, 但unicode也有多种表现形式首先, 我们说的unicode, 其实就是utf-16, 但...

    看到一篇讲文件编码的好文章:

    URL:http://www.iteye.com/topic/583064

     

    [Charset]UTF-8, UTF-16, UTF-16LE, UTF-16BE的区别 

    最近遇到的麻烦事 
    charset里的问题, 一般我们都用unicode来作为统一编码, 但unicode也有多种表现形式 

    首先, 我们说的unicode, 其实就是utf-16, 但最通用的却是utf-8, 
    原因: 我猜大概是英文占的比例比较大, 这样utf-8的存储优势比较明显, 因为utf-16是固定16位的(双字节), 而utf-8则是看情况而定, 即可变长度, 常规的128个ASCII只需要8位(单字节), 而汉字需要24位 

    UTF-16, UTF-16LE, UTF-16BE, 及其区别BOM 
    同样都是unicode, 为什么要搞3种这么麻烦? 
    先说UTF-16BE (big endian), 比较好理解的, 俗称大头 
    比如说char 'a', ascii为 
    0x61, 那么它的utf-8, 则为 [0x61], 但utf-16是16位的, 所以为[0x00, 0x61] 
    再说UTF-16LE(little endian), 俗称小头, 这个是比较常用的 
    还是char 'a', 它的代码却反过来: [0x61, 0x00], 据说是为了提高速度而迎合CPU的胃口, CPU就是这到倒着吃数据的, 这里面有汇编的知识, 不多说 
    然后说UTF-16, 要从代码里自动判断一个文件到底是UTF-16LE还是BE, 对于单纯的英文字符来说还比较好办, 但要有特殊字符, 图形符号, 汉字, 法文, 俄语, 火星语之类的话, 相信各位都很头痛吧, 所以, unicode组织引入了BOM的概念, 即byte order mark, 顾名思义, 就是表名这个文件到底是LE还是BE的, 
    其方法就是, 在UTF-16文件的头2个字节里做个标记: LE [0xFF, 0xFE], BE [0xFE, 0xFF] 

    理解了这个后, 在java里遇到utf-16还是会遇到麻烦, 因为要在文件里面单独判断头2个再字节是很不流畅的 

    小结: 

    Java代码  收藏代码
    1. InputStreamReader reader=new InputStreamReader(fin, charset)  


    1. 如果这个UTF-16文件里带有BOM的话, charset就用"UTF-16", java会自动根据BOM判断LE还是BE, 如果你在这里指定了"UTF-16LE"或"UTF-16BE"的话, 猜错了会生成乱七八糟的文件, 哪怕猜对了, java也会把头2个字节当成文本输出给你而不会略过去, 因为[FF FE]或[FE FF]这2个代码没有内容, 所以, windows会用"?"代替给你 
    2. 如果这个UTF-16文件里不带BOM的话, 则charset就要用"UTF-16LE"或"UTF-16BE"来指定LE还是BE的编码方式 


    另外, UTF-8也有BOM的, [0xEF, 0xBB, 0xBF], 但可有可无, 但用windows的notepad另存为时会自动帮你加上这个, 而很多非windows平台的UTF8文件又没有这个BOM, 真是难为我们这些程序员啊 

    错误的例子 
    1. 文件A, UTF16格式, 带BOM LE, 
    InputStreamReader reader=new InputStreamReader(fin, "utf-16le") 
    会多输出一个"?"在第一个字节, 原因: java没有把头2位当成BOM 

    2. 文件A, UTF16格式, 带BOM LE, 
    InputStreamReader reader=new InputStreamReader(fin, "utf-16be") 
    会出乱码, 原因: 字节的高低位弄反了, 'a' 在文件里 [0x61, 0x00], 但java以为'a'应该是[0x00 0x61] 

    3. 文件A, UTF16格式, 带BOM BE, 
    InputStreamReader reader=new InputStreamReader(fin, "utf-16le") 
    会出乱码, 原因: 字节的高低位弄反了, 'a' 在文件里 [0x00, 0x61], 但java以为'a'应该是[0x61 0x00] 

    4. 文件A, UTF16格式, 带BOM BE, 
    InputStreamReader reader=new InputStreamReader(fin, "utf-16be") 
    会多输出一个"?"在第一个字节, 原因: java没有把头2位当成BOM 

    5. 文件A, UTF16格式, LE 不带BOM, 
    InputStreamReader reader=new InputStreamReader(fin, "utf-16") 
    会出乱码, 因为utf-16对于java来说, 默认为be(1.6JDK, 以后的说不准) 
    但windows的notepad打开正常, 因为notepad默认为le, - -# 

    6. 文件A, UTF16格式, BE 不带BOM, 
    InputStreamReader reader=new InputStreamReader(fin, "utf-16") 
    恭喜你, 蒙对了 
    但winodws的notepad打开时, 每个字符中间都多了一个" ", 因为notepad把它当成ASNI了 

    在windows下输出unicode文件 
    通过java出来unicode文件, 也容易混淆 

    Java代码  收藏代码
    1. FileOutputStream fout=new FileOutputStream(file);  
    2. OutputStreamWriter writer=new OutputStreamWriter(fout, charset);  



    1. charset为"UTF-16"时, java会默认添加BOM [0xFE, 0xFF], 并以BE的格式编写byte 
    2. charset为"UTF-16BE"时, java不会添加BOM, 但编码方式为 BE 
    3. charset为"UTF-16LE"时, java不会添加BOM, 但编码方式为 LE 

    以上通过 test.getByte("utf-16"), test.getByte("utf-16be"), test.getByte("utf-16le") 可以验证 

    而windows的notepad默认的unicode为 LE, 并带BOM, 
    所以, 推荐输出 UTF-16LE, 并人为添加BOM, 即: 

    Java代码  收藏代码
    1. byte[] bom={-1, -2};    //FF FE, java的byte用的是补码, 验证: b=127, b+=1, 而b=-128  
    2. fout.write(bom);  



    转载于:https://www.cnblogs.com/zhuojiniao/p/3327282.html

    展开全文
  • UTF8UTF16UTF32区别

    千次阅读 2019-04-10 22:19:30
    UTF8UTF16UTF32区别

    UTF8、UTF16、UTF32都是unicode字符集的字符编码。

    UTF意思是unicode转换格式(Unicode transform format),出现UTF8、UTF16、UTF32是出于要在内存中存储字符的目的而对unicode字符编号进行编码。

    UTF8、UTF16、UTF32区别:(8、16、32可看做每种字符编码存储所需的最少的比特位数)

    UTF8:存在单字节编码,兼容ASCII;当编码为一个字节,则设最高比特位为0;当编码超过一个字节,则需要几个字节,就在第一个字节从最高位开始令连续的几个比特位为1,之后的字节最高位为10。

    UTF32:用固定长度的字节存储字符编码,不管Unicode字符编号需要几个字节,全部都用4个字节存储,直接存储Unicode编号。无需经过字符编号向字符编码的转换步骤,提高效率,用空间换时间。

    UTF16:使用2或4个字节进行存储。对于Unicode编号范围在0~FFFF之间的字符,统一用两个字节存储,无需字符转换,直接存储Unicode编号。对于Unicode字符编号在10000-10FFFF之间的字符,UTF16用四个字节存储,简单说就是:将Unicode字符编号(3字节)分为两部分,高位部分(Unicode字符编号中占1.5个字节)用一个值介于 D800-DBFF (110110yy yyyyyyyy,y为0/1)之间的双字节存储,低位部分用一个值介于 DC00-DFFF (110111xx xxxxxxxx,x为0/1)的双字节存储。而介于D800-DFFF之间的编码在Unicode中是预留的,不安排字符,如果Unicode中有字符的编号是这之间的值,会引发冲突和歧义,很有可能一个不常见字符(存储为四个字节)最后被读成两个常见字符(存储为两个字节)。

    参考:https://blog.csdn.net/pipi1375/article/details/84784392

    展开全文
  • 使用CString在UTF8UTF16之间转换。
  • Unicode,UTF8,UTF16,UTF32

    2019-12-30 20:58:03
    简单的介绍Unicode,UTF8,UTF16,UTF32 一、Unicode的创立 美国人意识到应当使用一种标准方案展示世界上所有语言的字符,Unicode诞生了。 Unicode就是一种编码字符集,UTF8UTF16UTF32即字符集编码,对应着不同的...

    简单的介绍Unicode,UTF8,UTF16,UTF32

    一、Unicode的创立
    美国人意识到应当使用一种标准方案展示世界上所有语言的字符,Unicode诞生了。
    Unicode就是一种编码字符集,UTF8,UTF16,UTF32即字符集编码,对应着不同的编码方式
    二、UTF8、UTF16、UTF16
    UTF8可变长的字符编码,使用一到四个字节表示表示一个字符。
    UTF8的编码规则:(1)对于单字节的符号,字节的第一位设为 0,后面的7位为这个符号的 Unicode 码,因此对于英文字母,UTF-8 编码和 ASCII 码是相同的。(2)对于需要使用 N 个字节来表示的字符(N > 1),第一个字节的前 N 位都设为 1,第 N + 1 位设为0,剩余的 N - 1 个字节的前两位都设位 10,剩下的二进制位则使用这个字符的 Unicode 码点来填充。
    UTF16,相对8来说较为简单,① 对于编号在 U+0000 到 U+FFFF 的字符(常用字符集),直接用两个字节表示。② 编号在 U+10000 到 U+10FFFF 之间的字符,需要用四个字节表示。
    UTF 32以32位无符号整数为单位,长度固定,按高低位顺序排序。

    展开全文
  • UTF8UTF16UTF32都是unicode字符集的字符编码。 UTF意思是unicode转换格式(Unicode transform format),出现UTF8UTF16UTF32是出于要在内存中存储字符的目的而对unicode字符编号进行编码。 UTF8UTF16UTF...
    1. UTF8、UTF16、UTF32都是unicode字符集的字符编码。
    2. UTF意思是unicode转换格式(Unicode transform
      format),出现UTF8、UTF16、UTF32是出于要在内存中存储字符的目的而对unicode字符编号进行编码。
    3. UTF8、UTF16、UTF32区别:(8、16、32可看做每种字符编码存储所需的最少的比特位数)
    • UTF8:存在单字节编码,兼容ASCII;当编码为一个字节,则设最高比特位为0;当编码超过一个字节,则需要几个字节,就在第一个字节从最高位开始令连续的几个比特位为1,之后的字节最高位为10。UTF8:存在单字节编码,兼容ASCII;当编码为一个字节,则设最高比特位为0;当编码超过一个字节,则需要几个字节,就在第一个字节从最高位开始令连续的几个比特位为1,之后的字节最高位为10。
    • UTF32:用固定长度的字节存储字符编码,不管Unicode字符编号需要几个字节,全部都用4个字节存储,直接存储Unicode编号。无需经过字符编号向字符编码的转换步骤,提高效率,用空间换时间。
    • UTF16:使用2或4个字节进行存储。对于Unicode编号范围在0~FFFF之间的字符,统一用两个字节存储,无需字符转换,直接存储Unicode编号。对于Unicode字符编号在10000-10FFFF之间的字符,UTF16用四个字节存储,简单说就是:将Unicode字符编号(3字节)分为两部分,高位部分(Unicode字符编号中占1.5个字节)用一个值介于 D800-DBFF (110110yy yyyyyyyy,y为0/1)之间的双字节存储,低位部分用一个值介于 DC00-DFFF (110111xx xxxxxxxx,x为0/1)的双字节存储。而介于D800-DFFF之间的编码在Unicode中是预留的,不安排字符,如果Unicode中有字符的编号是这之间的值,会引发冲突和歧义,很有可能一个不常见字符(存储为四个字节)最后被读成两个常见字符(存储为两个字节)。

    原文链接:https://blog.csdn.net/pipi1375/article/details/84784392

    展开全文
  • 今天用PL/SQL导入数据的时候遇到无法导入,提示UTF16 detected,this is not yet supported by the importer。另外换sqluldr导入数据后发现数据全部为null,看来确实是UTF16格式不支持在我的ORACLE9i数据库中。无奈...
  • UTF-8, UTF-16, UTF-16LE, UTF-16BE的区别

    千次阅读 2015-06-22 20:39:39
    原因: 我猜大概是英文占的比例比较大, 这样utf-8的存储优势比较明显, 因为utf-16是固定16位的(双字节), 而utf-8则是看情况而定, 即可变长度, 常规的128个ASCII只需要8位(单字节), 而汉字需要24位 UTF-16, UTF-16LE,...
  • UTF-8UTF-16UTF-32

    2020-01-25 12:17:04
    UTF-8UTF-16UTF-32有什么区别? 我知道他们都将存储Unicode,并且每个都使用不同的字节数来表示字符。 选择一个优于另一个是否有优势?
  • UTF-8 UTF-16 UTF-32转换代码 C语言编写
  • Unicode 与 UTF8 UTF16 UTF32什么是UnicodeUTF-8 UTF-16 UTF-32联系 什么是Unicode 定义: Java支持Unicode码,Unicode码是由Unicode协会建立的一种编码方案,它支持使用世界各种语言所书写的文本的交换、处理...
  • utf8 to utf16

    2017-02-22 07:09:40
    1. 问题描述: 将一个utf8 类型的字符串转换为utf16  /** utf8_to_utf16.c */ #define UTF8_END -1 #define UTF8_ERROR -2 typedef struct json_utf8_decode { int the_index; char *the_input; int the_...
  • Utf16ToUtf8

    千次阅读 2010-07-07 16:21:00
    摘自Qt源码: typedef unsigned char Uint8; typedef signed char Int8; typedef unsigned short Uint16; typedef signed short Int16; typedef signed int Int;...size_t utf16ToUtf8( char* dest, con
  • UTF8UTF16

    2017-04-01 16:37:00
    1 如果只是论一个汉字占用的字节数,那么 UTF-8 占用3个字节, UTF-16 占用2个字节。但是如果存储文本的话,需要在文本使用EF BB BF 三个字节表示使用 UTF-8 编码,使用FE FF 表示使用 UTF-16 编码。 2 UTF-16 ...
  • UTF-8 相互转换 UTF16

    2017-06-20 11:37:23
    UTF-8 相互转换 UTF16
  • UTF8,UTF16,UTF32,UTF16-LE,UTF16-BE,GBK 之间的转换 收藏  UTF8,UTF16,UTF32,UTF16-LE,UTF16-BE,GBK 之间的转换    Unicode是Unicode.org制定的编码标准,目前得到了绝大部分操作系统和编程语言的支持。...
  • 字符编码的概念(UTF-8UTF-16UTF-32都是什么鬼)

    万次阅读 多人点赞 2017-11-30 17:11:56
    UTF-16:介于 UTF-8UTF-32 之间,使用 2 个或者 4 个字节来存储,长度既固定又可变。 UTF 是 Unicode Transformation Format 的缩写,意思是“Unicode转换格式”,后面的数字表明至少使用多少个比特位(Bit)来...
  • UTF16UTF8

    2013-08-01 11:56:15
    [b][size=x-large]UTF-16[/size][/b] 说到 UTF 必须要提到 Unicode(Universal Code 统一码),ISO 试图想创建一个全新的超语言字典,世界上所有的语言都可以通过这本字典来相互翻译。可想而知这个字典是多么的复杂...
  • utf8utf16转换

    千次阅读 2019-03-14 23:18:59
    1.UTF8UTF16编码转换 std::string ConvertFromUtf16ToUtf8(const std::wstring& wstr) { std::string convertedString; int requiredSize = WideCharToMultiByte(CP_UTF8, 0, wstr.c_str(), -1, 0, 0, 0...
  • 【转自】 http://hi.baidu.com/zck98530/blog/item/7a25b01c23c1248986d6b6d1.html 关于UTF8,UTF16,UTF32,UTF16-LE,UTF16-BE Unicode是Unicode.org制定的编码标准,目前得到了绝大部分操作系统和编程语言的支持。...
  • lua中怎么从utf16转到utf8 ? 从网上找到个js的实现方法,但是不知道参数是什么, ``` function utf16ToUtf8(s){ if(!s){ return; } var i, code, ret = [], len = s.length; for(i = 0; i ; i++){ ...
  • unicode,utf-8,utf-16,utf-32

    2016-03-07 16:50:11
    Unicode,UTF-8UTF-16完整的说明请参考Wiki(Unicode,UTF-8UTF-16)。用比较简单的话来说就是,Unicode定义了所有可以用来表示字符的数值集合(称之为Code Point)。UTF-8UTF-16UTF标准定义了这些数值和...
  • UTF16&UTF32 一、Unicode是什么? Unicode(统一码、万国码、单一码)是计算机科学领域里的一项业界标准,包括字符集、编码方案等。Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个...
  • Unicode、UTF-8UTF-16UTF-32有什么区别?
  • UTF-8 UTF-16 UTF-32 比较

    2018-01-02 02:15:08
    优点 UTF-8 兼容 ASCII ...由于是变长,字符空间足够大,未来 Unicode 新标准收录更多字符,UTF-8 也能妥妥的兼容,因此不会再出现 UTF-16 那样的尴尬 不存在大小端字节序问题,信息交换时非常便...
  • Unicode,UTF-8UTF-16完整的说明请参考Wiki(Unicode,UTF-8UTF-16)。用比较简单的话来说就是,Unicode定义了所有可以用来表示字符的数值集合(称之为Code Point)。UTF-8UTF-16UTF标准定义了这些数值和...
  • UTF-8 使用一至四个字节的序列对编码 Unicode 代码点进行编码 UTF-16 使用两个或四个字节对 Unicode 代码点进行编码 UTF-32 始终使用4个字节 java中使用: length方法将返回采用UTF-16编码表示的给定字符串所...
  • utf-8,utf-16,utf-32与unicode unicode unicode是计算机科学领域的业界标准,用于对世界上存在的字符进行编码。进一步说unicode是一份字符码表,分为17个平面,U00****----U10****(16进制),所以每个平面下有2的16...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 24,500
精华内容 9,800
关键字:

168utfutf