精华内容
下载资源
问答
  • 该代码显示了如何统一的方式阅读pdf,pdf扫描和tiff文档。 可以很容易地看出,无论文件格式如何,我们都返回包含每个页面的段落,每个段落的行和每行的单词的页面列表。 List< DocPage> result = processFile&#...
  • 注意:中文版BUG,好像不能直接输入中文,可以用txt先写,然后复制(ctrl+V)过来 X3D(Extensible3D-可扩展3D)是一个软件标准,定义了如何在多媒体中整合基于... X3D也致力于建立一个3D图形与多媒体的统一的交换格式
  • 修改数据传送模式,保证了数据在粘贴板、编辑器、保存文档之间传输时的统一。 2013年2月7号,神笔马良强制码字软件推出 V1.0.0.9 更新版本,主要更新记录如下: 修改关键字搜索中向上排查出现失误的情况,更正...
  • 批处理文件是无格式的文本文件,它包含一条或多条命令。它的文件扩展名为 .bat 或 .cmd。在命令提示下键入批处理文件的名称,或者双击该批处理文件,系统就会调用Cmd.exe按照该文件中各个命令出现的顺序来逐个运行...
  • 文字乱码的问题基本都是由于编码格式不同导致的。 简单来说,计算机起源于欧美国家,开始只支持asiic码,也就是英文字母和字符,那么汉字或者日文等语言就无法表示,后来对应的就出现了其他编码格式,比如汉字的gbk...

    Python写文件有中文字,会出现乱码的错误问题。那么如何分析解决呢?
    在这里插入图片描述
    错误分析:
    文字乱码的问题基本都是由于编码格式不同导致的。
    简单来说,计算机起源于欧美国家,开始只支持asiic码,也就是英文字母和字符,那么汉字或者日文等语言就无法表示,后来对应的就出现了其他编码格式,比如汉字的gbk编码,可以将汉字转化为对应的英文编码,计算机可以识别。
    这时由于编码不同,经常会出现乱码的情况。
    最后,大家约定都统一使用unicode标准,其中utf-8编码就是这个标准中的通用的一个。

    解决方法:
    函数里添加一个encoding参数
    强制设置文件的编码格式。
    open(‘zen.txt’,‘w’,encoding=‘utf-8’)

    展开全文
  • 用连字符“&”来合并文本怎样把不同格式不同位置的内容合并到一个单元格内 把不同单元格的内容合到一个单元格里 合并与拆分 合并不同单元格的内容 关于文字在表格中的组合 求拆解合并公式 如何把字母和数字分开? 把...
  • EXCEL函数公式集

    热门讨论 2010-03-16 03:26:38
    用连字符“&”来合并文本怎样把不同格式不同位置的内容合并到一个单元格内 把不同单元格的内容合到一个单元格里 合并与拆分 合并不同单元格的内容 关于文字在表格中的组合 求拆解合并公式 如何把字母和数字分开? 把...
  • 任何数据,在计算机中存储的格式都是二进制,那么该不同的数据该如何用二进制表示呢? 现在的数据各种各样,不同国家的数据(文字或字符)表示都是不同的,考虑到国际化和互联网的普及,就要求用一个统一的表示方法来...

     

    任何数据,在计算机中存储的格式都是二进制,那么该不同的数据该如何用二进制表示呢?   

    现在的数据各种各样,不同国家的数据(文字或字符)表示都是不同的,考虑到国际化和互联网的普及,就要求用一个统一的表示方法来进行数据到二进制的转化,这样所有的数据都能在计算机中进行共享,这就是UNICODE出现的前提。(早期的历史就不说了,ASCII用于英文国家,GBXXXX用于中文等等)

     

    1. UNICODE - 国际统一编码

      UNICODE使用4个字节来表示世界上所有的字符(4个字节可以表示2的32次方个字符,远远超过世界上所有字符的总量,就算随着发展,新字符的不断出现,也用不完)。所以,一般可以把UNICODE看作是一个字符的集合,世界上任何一个字符都能在这个集合中找到对应的UNICODE编码(十六进制)。我曾想,如果世界上所有的字符表示都用UNICODE编码,那么每个字符在计算机中都是占有4个字节。 在使用时,直接从计算机中每次读取4个字节,就能得到对应的字符。 那么世界上永远不会出现万恶的乱码问题。

        但现实总是残酷的,这样美好的事情目前是不可能出现的(期待未来能够实现). 依本人之愚见,原因有二:

        1/ UNICODE占用4个字节,但目前世界上大部分(65535个=2的16次方)字符都可以只用2个字节就可以表示,前面的2个字节全部是0. 超过65535那部分的字符在一般的应用中几乎用不到。如果为了这一小部分字符,而将65535这部分常用字符都用4个字节表示,那么涉及字符的硬盘/内存/网络传输/.....等等都将浪费一半,这将是多么浪费的一件事。

        2/ 目前的程序语言对4个字节的UNICODE编码的字符支持不够。 比如:C/C++语言中标准字符串处理函数只支持单个字节(ASCII码中的字符)。 虽然JAVA语言的字符是用UNICODE表示的,但Java中的unicode仅仅是2个字节(16位)的,而不是4个字节的(32位)的,所以我的愚见是:java中unicode其实只支持前面所述的那部分常见的字符(65535个),也就是说Java中的unicode其实是utf16编码(后面会讲到),不是标准的32位的UNICODE编码。

     

        基于这两个原因,用UNICODE进行编码暂时是个美好的愿景,那么实际中该如何对字符进行编码,存入计算机中呢? 这就是utf出现的原因.

        在分析UTF之前,先说说UTF跟UNICODE的区别,可以简单的理解UNICODE就是一个字符集,只是规定的任何字符的一个十六进制(也可认为是二进制)表示,但是实际的使用中并没有用UNICODE进行编码(也就是说存入计算机中的字符并不是按照UNICODE的十六进制表示)。而UTF根据UNICODE字符集进行转换得到的,是实际使用的(存入计算机)。

     

    2. UTF - UTF32/16/8

        UTF32, 用4个字节来表示每个字符,与UNICODE字符集一一映射,空间浪费太严重,目前没有被应用。重点说说UTF16和UTF8.

        1/ UTF16

          尽管有Unicode字符非常多,但是实际上大多数人不会用到超过前65535个以外的字符,所以就出现UTF16编码,16意味着16位,即2个字节。可以一一映射unicode字符集中的65535个字符,这部分字符的utf16编码跟unicode集中的unicode编码是一样的,所以在这种情况下,unicode编码就是utf16编码。但是遇到超出65535的字符时,utf16该如何编码呢?    

    16进制编码范围UTF-16表示方法(二进制)10进制码范围字节数量
    0000 0000---0000 FFFF xxxxxxxx xxxxxxxx 0-65535 2
    0001 0000---0010 FFFF

    110110yyyyyyyyyy 110111xxxxxxxxxx

    65536-1114111 4

    如上表可知, 这里是UTF-16的编码方式。我们可以看到,对于超过两个字节的字符,UTF-16表示成了4个字节。而这4个字节为了能跟2字节的普通字符区分开来,他的开头用到了为UTF-16保留的Unicode范围。在读取utf16编码的字符且是big endian(后面会讲到),还是以2个字节为单位进行读取,读到的是高位的两个字节(110110yyyyyyyyyy),检查这两个字节的高字节是不是在D800-DBFF范围内。如果是,那表示我们读到了一个超过两个字节的字符,那我们就知道这两个字节跟接下来的两个字节才能组成一个真正的字符。如果不在D800-DBFF范围内,那简单了,这就是一个双字节的字符而已。  如果读取的字节是little endian,这个时候,我们先读到的是低位的双字节(110111xxxxxxxxxx),这就需要检查是否在DC00-DFFF范围内。

        前面讲到big endian和little endian, 那么这两个是什么意思呢? 其实还比较好理解,utf16编码有2个字节组成,那么在进行存储时,到底是高位字节在前面还是地位字节在前面呢? 如果高位字节在前,那么就是big endian的方式,反之就是little endian.  举一个例子, 汉字 “严”的unicode是4E25,如果在文件中进行存储时,4E在前,25在后,那么这就是big endian的方式,这种方式系统会自动的在文件前加上两个字节FE FF,反之就是little endian的方式,在文件前加两个子FF FE.  文件开头加上的FF FE或FE FF就是BOM(Byte order mask).  

        总结: unicode编码在大部分情况(0~65535范围呢)下就是utf16编码。目前java语言中默认的字符编码是unicode,这里的unicode就是utf16.  Windows API也是unicode编码的,这里的unicode也是utf16,都是用两个字节来进行表示一个字符的(包括英文字母)

        2/ UTF8

        由于UTF16对大部分数据都是用两个字节来进行编码, 甚至是以前的ASCII中的127个字符,还是会造成一部分浪费和存在不兼容的问题。所以**组织又发明了一种UTF8编码。这种编码很有意思,它是可变的,也可以表示UNICODE中的所有字符,只不过是用的字节数可能为1~4个。

    •   以前的127个ASCII编码仍然采用1个字节编码。 所以UTF8兼容ASCII码,且只用1个字节, 这部分对应的UNICODE范围为U+0000至U+007F)
    •   带有附加符号的拉丁文、希腊文、西里尔字母、亚美尼亚语、希伯来文、阿拉伯文、叙利亚文及它拿字母则需要二个字节编码(Unicode范围由U+0080至U+07FF)
    •   其他的CJK(中日韩)等常用字符都用3个字节(Unicode范围由U+0080至U+07FF)。
    •   其他极少使用4个字节

          Unicode符号范围 | UTF-8编码方式

      (十六进制) | (二进制)
      --------------------+---------------------------------------------
      0000 0000-0000 007F | 0xxxxxxx
      0000 0080-0000 07FF | 110xxxxx 10xxxxxx
      0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
      0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

      UTF8目前是使用最为广泛的一种编码,互联网中大部分都使用UTF8编码,因为它有以下优点:

    •  兼容ASCII字符,以前的一个ASCII字符就是一个UTF8字符
    •  不存在UTF16的字节顺序的问题(原因请见后面的难点分析)
    •  

         当然,UTF8也有一些缺点:

    •  因为每个字符使用不同数量的字节编码,所以寻找串中第N个字符比较麻烦。 

    难点分析 - 愚人之见:

    1. utf8 with/without bom是什么意思?utf8为什么没有字节序的问题?utf16为什么会有字节序的问题? 为什么不解决这个问题?

        1/ 要解答这些问题,需要首先理清主机字节序 和 网络字节序

        主机字节序,就是前面介绍到的big endian(BE)和little endian(LE)。不同的CPU有不同的字节序类型,举一个例子,在内存中汉字 “严”的unicode是4E25。假设以UTF16编码方式存入内存4000~4001. ,它会是怎么样呢?

         内存地址 4000 4001

                  LE 25 4E 

                  BE 4E 25

        某个UTF16编码文件(文件起始两个字节为FF FE 或 FE FF)中的字节序也有BE和LE之分,是为了其他程序如何来解析文件中的UTF16字符用的,这里的BE和LE与CPU无关。

        网络字节序:TCP/IP中规定好的一种数据表示格式,它与具体的CPU类型、操作系统等无关,从而可以保证数据在不同主机之间传输时能够被正确解释。网络字节顺序采用big endian排序方式。

        可以这么来想象: A机器上要传”严“到B机器,按照A机器CPU类型,严字在内存中是以BE的方式存储的,那么它应该为"4E 25"(假设内存自小到大),进行传输前,会用htons方法将"4E 25"转换为网络字节序("4E 25",都是BE,所以相同)。 B机器在接受该网络字节时,用ntoh将网络字节序("25 4E")转到B机器的主机字节序(假设为LE) - " 25 4E"。

        这就解释了为什么UTF16有字节序的原因。

        2/ utf8为什么没有字节序呢? 因为utf8是按照一个一个字节进行存储的,而不是按照两个字节进行存储的(utf16)。 还是以"严"字为例,它的utf8的编码是"E4 B8 A5",它不是以这三个字节整体进行存储的,而是把它看作3个单独的字节"E4" "B8" "A5", 所以在内存中也是"E4" "B8" "A5", 进行网络传输时也是"E4" "B8" "A5"。

        3/ 为什么不解决UTF16的字节序的问题呢? 也就是说全部统一采用LE 或者 BE呢? 这样不就解决了这个问题了吗? 这是因为现实中,每个CPU应用不同的操作系统时没有采用统一的字节序标准,所以没法解决。

        4/ 既然UTF8没有字节序问题,那么为什么在有些文件编辑工具中看到UTF8 with/without BOM。 这个是为了区分UTF8和UTF16。 UTF16是以FF FE/FE FF打头的,而UTF8 with BOM是以EF BB BF打头的,这三个打头的字节没有任何意义,只是为了表明当前的编码是utf8的。 那么UTF8 without BOM当然就是utf8字节流,没有前面打头的三个字节。

     2. 既然unicode只是一个字符集,不直接用于编码,那么为什么windows说它的API是unicode编码的呢? 为什么有的文件编辑工具(e.g. NOTEPAD++)在保存时出现"Unicode" 或 "Unocide big endian"?

        这里的unicode实际上就是UTF16编码,因为UTF16大部分都是跟unicode字符集一一匹配的。

     

    编程时需要注意的问题:

    1. 标准C函数库里面的字符串相关的函数仅仅支持之前的ASCII范围内的字符。 也就是说strcpy(char*, char*)/strlen(char*)等仅仅支持英文字符和一部分特殊字母。如果遇到拉美字符和CJK字符时,就不能用标准C函数库中的函数, 那应该如何处理?

       目前比较通用的一个解决方案是借助于开源的ICU,ICU是基于UNICODE(即UTF16)的一个开源库,ICU库用的字符类型是UChar(实际上是wchar_t),wchar_t是两个字节的,可以用来存储世界上大部分字符。 针对UChar类型,ICU也有很多相应的函数库,如u_strcpy(UChar*, UChar*)/u_strlen(UChar*)等

     

       当然,如果够厉害的话,可以实现一套UTF8的函数库,utf8_strcpy(char*,char*)/utf8_strlen(char*).  注意,UTF8是一个一个字节为单位存在于内存中的,所以可以用char来表中一个UTF8字符中的一个字节。 

    举一个例子: 计算utf8_strlen(char*)

    int utf8_strlen(char *)
    {
            int rc = 0;
    	char	c1;
    	while (c1 = *str)
    	{
    		if (c1 < 0x80)
    		{
    			str++;
    		}
    		else if (c1 < 0xE0)
    		{
    			str += 2;
    		}
    		else if (c1 < 0xF0) 
    		{
    			str += 3;
    		}
    		else
    		{
    			str += 4;
    		}
    		rc++;
    	}
    	return (rc);
    }
    

    2. Java

       Java跨平台也跨地域,其中很重要的是Java是采用Unicode字符编码(我理解就是UTF16),所以任何字符都是用2个字节来表示(包括ASCII范围内)。由于在JAVA内部采用的Unicode编码,再IO操作时,需要进行一定的转码。 如果输出到文件,则会按照OS默认的编码进行转换(UTF16->os默认编码),这部分工作其实是Reader和Writer类等类隐式做了。 如果要显式的制定文件的格式(e.g. UTF8),则需要InputStremReader/OutputStreamWriter, 指定转换的类型。   

       Linux默认的编码是UTF8, 中文windows默认的是gb2312.

     

    若理解有误,欢迎批评指正!

     

    转载于:https://www.cnblogs.com/renzhezhiye/archive/2013/04/25/3041386.html

    展开全文
  • C#编程经验技巧宝典

    热门讨论 2008-06-01 08:59:33
    104 <br>0171 如何只允许输入指定图片格式 105 <br>0172 如何设置录入图片统一图片大小 105 <br>5.4 数组处理技巧 105 <br>0173 如何转换数组类型 105 <br>0174 如何复制数组中一系列元素的...
  • 实例007 统一窗体中控件的字体设置 实例008 通过“格式”菜单布局窗体 1.3 快速开发项目必备 实例009 为项目添加DLL文件引用 实例010 为项目添加已有类 实例011 为项目添加第三方控件 实例012 为项目添加已有...
  • 实例052 统一站内网页风格 实例053 设置超链接文字的样式 实例054 网页换肤 实例055 滚动文字 实例056 制作渐变背景 实例057 CSS控制绝对定位 实例058 CSS控制垂直居中 实例059 CSS实现的图文混排 3.2 表格...
  • 实例007 统一窗体中控件的字体设置 实例008 通过“格式”菜单布局窗体 1.3 快速开发项目必备 实例009 为项目添加DLL文件引用 实例010 为项目添加已有类 实例011 为项目添加第三方控件 实例012 为项目添加已有...
  • 实例052 统一站内网页风格 实例053 设置超链接文字的样式 实例054 网页换肤 实例055 滚动文字 实例056 制作渐变背景 实例057 CSS控制绝对定位 实例058 CSS控制垂直居中 实例059 CSS实现的图文混排 3.2 表格...
  • 实例007 统一窗体中控件的字体设置 实例008 通过“格式”菜单布局窗体 1.3 快速开发项目必备 实例009 为项目添加DLL文件引用 实例010 为项目添加已有类 实例011 为项目添加第三方控件 实例012 为项目添加已有...
  • 6.7 textGeometry 文字几何体 详细参数设置 示例中是老版本threejs的js文字方式,参数设置中是新版本的json文字方式 typeface在线字体库获取相关字体文件 6.8 几何体的二元操作 几何体的合并、相减、相交操作 详细...
  •  实例007 统一窗体中控件的字体设置 9  实例008 通过“格式”菜单布局窗体 10 1.3 快速开发项目必备 10  实例009 为项目添加DLL文件引用 10  实例010 为项目添加已有类 11  实例011 为项目添加第三方控件 ...
  • 实例007 统一窗体中控件的字体设置 10 实例008 通过“格式”菜单布局窗体 10 1.3 快速开发项目必备 11 实例009 为项目添加DLL文件引用 11 实例010 为项目添加已有类 12 实例011 为项目添加第三方控件 13 实例012 为...
  • JavaScript语言参考手册

    热门讨论 2009-05-30 15:01:13
    本书以下面的格式使用使用统一资源定位符 (URL) http://server.domain/path/file.html 在这些 URL 中,server 代表你运行应用程序的服务器名,如 research1 或 www ;domain 代表你的 Internet 域名,如 netscape....
  • 实例071 如何将字节单位B转换成GB、MB 和KB 108 实例072 身份证号从15位升到18位算法 109 第3章 面向对象编程思想 111 3.1 面向对象家族核心——类与类成员 112 实例073 面向对象编程核心——类、对象和引用 112 ...
  • 实例071 如何将字节单位B转换成GB、MB 和KB 108 实例072 身份证号从15位升到18位算法 109 第3章 面向对象编程思想 111 3.1 面向对象家族核心——类与类成员 112 实例073 面向对象编程核心——类、对象和引用 112 ...
  • 实例071 如何将字节单位B转换成GB、MB 和KB 108 实例072 身份证号从15位升到18位算法 109 第3章 面向对象编程思想 111 3.1 面向对象家族核心——类与类成员 112 实例073 面向对象编程核心——类、对象和引用 112 ...
  • 其强大的个性化定制功能,由简单到深入,适合不同层次的人,让不同的客户都能将他们的影像记忆永远的保留下来。    全球印个性化产品设计解决方案几大特点 : 1,完全可离线设计,客户不用联网就可以使用全球印...
  • 除了提供大屏系统外,还将每个模块都做了独立的模块示例界面,每个模块都可以独立学习使用,里面用到的控件也单独做了控件示例界面,方便学习每个控件如何使用,考虑着实周到! 超级详细的开发和使用手册,其中包括...
  • 不同的颜色,字体,形状,样式,图片,文字和符号,为每个图表对象。 轻松,直观地呈现复杂的信息具有广泛的图表。这些图表更聪明和更有用的基​​础数据,它提供了一个更完整的系统或过程的。 与MS Office。它...

空空如也

空空如也

1 2 3 4 5
收藏数 82
精华内容 32
关键字:

不同格式文字如何统一