精华内容
下载资源
问答
  • plsql字符乱码-字符集设置

    千次阅读 2017-06-15 14:23:54
    plsql字符乱码

    --查询远程oracle数据库字符集

    select * from nls_database_parameters


    --查询本地pl/sql 工具使用的字符集

    select  userenv('language') from dual;


    --依据远程oracle的字符集,设置本地计算机环境变量

    --新增本地变量

    NLS_LANG = American_America.ZHS16GBK

    展开全文
  • 中文字符乱码问题的解决方法

    千次阅读 2018-11-08 15:37:07
    中文字符乱码问题的解决方法   转载:http://blog.chinaunix.net/uid-26284395-id-3303341.html   Jsp+servlet+tomcat6.0+ibatis+mysql5.0框架,中文字符乱码问题的解决总结 首先总结我的项目字符集设置: 1、...

                             中文字符乱码问题的解决方法

     

    转载:http://blog.chinaunix.net/uid-26284395-id-3303341.html

     

    Jsp+servlet+tomcat6.0+ibatis+mysql5.0框架,中文字符乱码问题的解决总结

    首先总结我的项目字符集设置:

    1、jsp、servlet字符集要统一,如果要用gbk就都用gbk。或者都用utf-8。我都统一用得是utf-8;(我在servlet中分别对request和response进行了字符集设置,并且还应用

       new String(S.getBypes(ISO-8859-1),"UTF-8" )  由于他和request的设置的作用是相同的,    

       所以我得到还是乱码,由此可以看出不是吧所有的字符集设置都加上就是正确的)

    2、在未插入数据库之前一定要确认servlet在jsp页面获得的是否为中文。

    3、Ibatis 在连接mysql的时候 url 里面加的characterEncoding 的值要和mysql的字符集一制。

    4、为解决中文问题,mysql我用的gbk。

    5、Mysql5.0 的驱动也很重要,驱动要和mysql的版本一致,要不然也会出问题,这个是出现中文字符乱码的原因之一。

    6、Tomcat 字符集的设置,修改 D:\Tomcat 6.0\conf\server.xml   

                  connectionTimeout="20000"

                  redirectPort="9443" URIEncoding='GBK'  />

    增加对GET方法获取数据时的编码设置参数 URIEncoding='GBK',(设置tomcat对我项目影响不大,我刚才测试了一下,如果不设置也正常运行,设置这项对于用get方法获取参数是有作用)

    7、我在网上查了好多的资料好多人都说mysql和jsp、servlet 最好统一字符,确实统一字符会少很多麻烦,由于我的mysql设置成utf-8就有问题,所以我就设置成gbk的了!按照网上说的更改my.ini 文件结合设置语句,都统一成下面这样了

    8、其实遇到中文乱码问题的人很多,主要原因就是没有弄清jsp、servlet、mysql之间字符集是怎么转换的,个人认为应该先从理论上理解,自己在做一些测试,如果还是有问题,就要一步一步的测试,中文问题也就容易解决了!

    针对字符集的问题我查阅了很多资料,下面整体进行总结一下:

    下面对于字符集的设置在jsp、servlet、mysql、tomcat中的作用

    首先要清楚几个名词解释及其作用
     

        1. contentType: <%@ page contentType=”text/html; charset=UTF-8″%>
        2. pageEncoding:<%@ page pageEncoding=”UTF-8″%>
        3. html页面charset:
        4. setCharacterEncoding:request.setCharacterEncoding(),response.setCharacterEncoding()
        5. setContentType:response.setContentType()
        6. jsp页面编码: jsp文件本身的编码
        7. web页面显示编码:jsp的输出流在浏览器中显示的编码
        8. web页面输入编码: 输入框输入的字体编码
        9. web服务器输入的请求流: web Server相应浏览器的请求数据
        10. web服务器输出的响应流: web Server相应浏览器的输出数据

    1、JSP/Servlet中的几个字符编码的作用 

    在JSP/Servlet中主要有以下几个地方可以设置编码,pageEncoding="UTF-8"、contentType="text/html;charset=UTF-8"、request.setCharacterEncoding("UTF-8")和response.setCharacterEncoding("UTF-8"),其中前两个只能用于JSP中,而后两个可以用于JSP和Servlet中。

    (1)pageEncoding="UTF-8"的作用是设置JSP编译成Servlet时使用的编码。

         众所周知,JSP在服务器上是要先被编译成Servlet的。pageEncoding="UTF-8"的作用就是告诉JSP编译器在将JSP文件编译成Servlet时使用的编码。通常,在JSP内部定义的字符串(直接在JSP中定义,而不是从浏览器提交的数据)出现乱码时,很多都是由于该参数设置错误引起的。例如,你的JSP文件是以GBK为编码保存的,而在JSP中却指定pageEncoding="UTF-8",就会引起JSP内部定义的字符串为乱码。

    另外,该参数还有一个功能,就是在JSP中不指定contentType参数,也不使用response.setCharacterEncoding方法时,指定对服务器响应进行重新编码的编码。

    补充: pageEncoding, 只是指明了 JSP 页面本身的编码格式,跟页面显示的编码没有关系; 容器在读取(文件)或者(数据库)或者(字符串常量)时将起转化为内部使用的 Unicode,而              页面显示的时候将内部的Unicode转换为contentType指定的编码后显示页面内容;如果pageEncoding属性存在,那么JSP页面的字符编码方式就由pageEncoding决定,否则就由contentType属性中的charset决定,如果charset也不存在,JSP页面的字符编  码方式就采用默认的ISO-8859-1。

    (2)contentType="text/html;charset=UTF-8"的作用是指定对服务器响应进行重新编码的编码。
        在不使用response.setCharacterEncoding方法时,用该参数指定对服务器响应进行重新编码的编码。服务器在将数据发送到浏览器前,对数据进行重新编码时,使用的就是该编码。

    (3)request.setCharacterEncoding("UTF-8")的作用是设置对客户端请求进行重新编码的编码。
    该方法用来指定对浏览器发送来的数据进行重新编码(或者称为解码)时,使用的编码

    (4)response.setCharacterEncoding("UTF-8")的作用是指定对服务器响应进行重新编码的编码。服务器在将数据发送到浏览器前,对数据进行重新编码时,使用的就是该编码。

     其次,要说一说浏览器是怎么样对接收和发送 的数据进行编码的

      response.setCharacterEncoding("UTF-8")的作用是指定对服务器响应进行重新编码的编码。同时,浏览器也是根据这个参数来对其接收到的数据进行重新编码(或者称为解码)。所以在无论你在JSP中设置response.setCharacterEncoding("UTF-8")或者response.setCharacterEncoding("GBK"),浏览器均能正确显示中文(前提是你发送到浏览器的数据编码是正确的,比如正确设置了pageEncoding参数等)。读者可以做个实验,在JSP中设置response.setCharacterEncoding("UTF-8"),在IE中显示该页面时,在IE的菜单中选择"查看(V)"à"编码(D)"中可以查看到是" Unicode(UTF-8)",而在在JSP中设置response.setCharacterEncoding("GBK"),在IE中显示该页面时,在IE的菜单中选择"查看(V)"à"编码(D)"中可以查看到是"简体中文(GB2312)"。

      浏览器在发送数据时,对URL和参数会进行URL编码,对参数中的中文,浏览器也是使用response.setCharacterEncoding参数来进行URL编码的。以百度和GOOGLE为例,如果你在百度中搜索"汉字",百度会将其编码为"%BA%BA%D7%D6"。而在GOOGLE中搜索"汉字",GOOGLE会将其编码为"%E6%B1%89%E5%AD%97",这是因为百度的response.setCharacterEncoding参数为GBK,而GOOGLE的的response.setCharacterEncoding参数为UTF-8。

      浏览器在接收服务器数据和发送数据到服务器时所使用的编码是相同的,默认情况下均为JSP页面的response.setCharacterEncoding参数(或者contentType和pageEncoding参数),我们称其为浏览器编码。当然,在IE中可以修改浏览器编码(在IE的菜单中选择"查看(V)"à"编码(D)"中修改),但通常情况下,修改该参数会使原本正确的页面中出现乱码。一个有趣的例子是,在IE中浏览GOOGLE的主页时,将浏览器编码修改为"简体中文(GB2312)",此时,页面上的中文会变成乱码,不理它,在文本框中输入"汉字",提交,GOOGLE会将其编码为"%BA%BA%D7%D6",可见,浏览器在对中文进行URL编码时,使用的就是浏览器编码。

      弄清了浏览器是在接收和发送数据时,是如何对数据进行编码的了,我们再来看看服务器是在接收和发送数据时,是如何对数据进行编码的。

      对于发送数据,服务器按照response.setCharacterEncoding—contentType—pageEncoding的优先顺序,对要发送的数据进行编码。

      对于接收数据,要分三种情况。一种是浏览器直接用URL提交的数据,另外两种是用表单的GET和POST方式提交的数据。

      因为各种WEB服务器对这三种方式的处理也不相同,所以我们以Tomcat5.0为例。

      无论使用那种方式提交,如果参数中包含中文,浏览器都会使用当前浏览器编码对其进行URL编码。

      对于表单中POST方式提交的数据,只要在接收数据的JSP中正确request.setCharacterEncoding参数,即将对客户端请求进行重新编码的编码设置成浏览器编码,就可以保证得到的参数编码正确。有些读者可能会问,那如何得到浏览器编码呢?上面我们提过了,在默认请情况下,浏览器编码就是你在响应该请求的JSP页面中response.setCharacterEncoding设置的值。所以对于POST表单提交的数据,在获得数据的JSP页面中request.setCharacterEncoding要和生成提交该表单的JSP页面的response.setCharacterEncoding设置成相同的值。

      对于URL提交的数据和表单中GET方式提交的数据,在接收数据的JSP中设置request.setCharacterEncoding参数是不行的,因为在Tomcat5.0中,默认情况下使用ISO-8859-1对URL提交的数据和表单中GET方式提交的数据进行重新编码(解码),而不使用该参数对URL提交的数据和表单中GET方式提交的数据进行重新编码(解码)。要解决该问题,应该在Tomcat的配置文件的Connector标签中设置useBodyEncodingForURI或者URIEncoding属性,其中useBodyEncodingForURI参数表示是否用request.setCharacterEncoding参数对URL提交的数据和表单中GET方式提交的数据进行重新编码,在默认情况下,该参数为false(Tomcat4.0中该参数默认为true);URIEncoding参数指定对所有GET方式请求(包括URL提交的数据和表单中GET方式提交的数据)进行统一的重新编码(解码)的编码。URIEncoding和useBodyEncodingForURI区别是,URIEncoding是对所有GET方式的请求的数据进行统一的重新编码(解码),而useBodyEncodingForURI则是根据响应该请求的页面的request.setCharacterEncoding参数对数据进行的重新编码(解码),不同的页面可以有不同的重新编码(解码)的编码。所以对于URL提交的数据和表单中GET方式提交的数据,可以修改URIEncoding参数为浏览器编码或者修改useBodyEncodingForURI为true,并且在获得数据的JSP页面中request.setCharacterEncoding参数设置成浏览器编码。

    2、下面总结下,以Tomcat5.0为WEB服务器时,如何防止中文乱码。
    (1)  对于同一个应用,最好统一编码,推荐为UTF-8,当然GBK也可以。
     (2)  正确设置JSP的pageEncoding参数
     (3)在所有的JSP/Servlet中设置contentType="text/html;charset=UTF-8"或response.setCharacterEncoding("UTF-8"),从而间接实现对浏览器编码的设置。
    (4)对于请求,可以使用过滤器或者在每个JSP/Servlet中设置request.setCharacterEncoding("UTF-8")。同时,要修改Tomcat的默认配置,推荐将useBodyEncodingForURI参数设置为true,也可以将URIEncoding参数设置为UTF-8(有可能影响其他应用,所以不推荐)。

    3、Mysql字符集设置

    基本概念

    • 字符(Character)是指人类语言中最小的表义符号。例如’A'、’B'等;

    • 给定一系列字符,对每个字符赋予一个数值,用数值来代表对应的字符,这一数值就是字符的编码(Encoding)。例如,我们给字符’A'赋予数值0,给字符’B'赋予数值1,则0就是字符’A'的编码;

    • 给定一系列字符并赋予对应的编码后,所有这些字符和编码对组成的集合就是字符集(Character Set)。例如,给定字符列表为{’A',’B'}时,{’A'=>0, ‘B’=>1}就是一个字符集;

    • 字符序(Collation)是指在同一字符集内字符之间的比较规则;

    • 确定字符序后,才能在一个字符集上定义什么是等价的字符,以及字符之间的大小关系;

    • 每个字符序唯一对应一种字符集,但一个字符集可以对应多种字符序,其中有一个是默认字符序(Default Collation);

    • MySQL中的字符序名称遵从命名惯例:以字符序对应的字符集名称开头;以_ci(表示大小写不敏感)、_cs(表示大小写敏感)或_bin(表示按编码值比较)结尾。例如:在字符序“utf8_general_ci”下,字符“a”和“A”是等价的;

    MySQL字符集设置

    • 系统变量:

    – character_set_server:默认的内部操作字符集

    – character_set_client:客户端来源数据使用的字符集

    – character_set_connection:连接层字符集

    – character_set_results:查询结果字符集

    – character_set_database:当前选中数据库的默认字符集

    – character_set_system:系统元数据(字段名等)字符集

    – 还有以collation_开头的同上面对应的变量,用来描述字符序。

    1.MySQL默认字符集

    MySQL对于字符集的指定可以细化到一个数据库,一张表,一列,应该用什么字符集。

    但是,传统的程序在创建数据库和数据表时并没有使用那么复杂的配置,它们用的是默认的配置,那么,默认的配置从何而来呢?    (1)编译MySQL 时,指定了一个默认的字符集,这个字符集是 latin1;

        (2)安装MySQL 时,可以在配置文件 (my.ini) 中指定一个默认的的字符集,如果没指定,这个值继承自编译时指定的;

        (3)启动mysqld 时,可以在命令行参数中指定一个默认的的字符集,如果没指定,这个值继承自配置文件中的配置,此时 character_set_server 被设定为这个默认的字符集;

        (4)当创建一个新的数据库时,除非明确指定,这个数据库的字符集被缺省设定为character_set_server;

        (5)当选定了一个数据库时,character_set_database 被设定为这个数据库默认的字符集;

        (6)在这个数据库里创建一张表时,表默认的字符集被设定为 character_set_database,也就是这个数据库默认的字符集;

        (7)当在表内设置一栏时,除非明确指定,否则此栏缺省的字符集就是表默认的字符集;

    简单的总结一下,如果什么地方都不修改,那么所有的数据库的所有表的所有栏位的都用 latin1 存储,不过我们如果安装 MySQL,一般都会选择多语言支持,也就是说,安装程序会自动在配置文件中把 default_character_set 设置为 UTF-8,这保证了缺省情况下,所有的数据库的所有表的所有栏位的都用 UTF-8 存储。

    2.查看默认字符集(默认情况下,mysql的字符集是latin1(ISO_8859_1)

    通常,查看系统的字符集和排序方式的设定可以通过下面的两条命令:

         mysql> SHOW VARIABLES LIKE 'character%';

    +--------------------------+---------------------------------+

    | Variable_name            | Value                           |

    +--------------------------+---------------------------------+

     

    展开全文
  • Android中字符乱码问题

    万次阅读 2014-05-28 22:44:43
    Android中音乐字符乱码问题 在Android系统设备中,如果有包含简体中文或繁体中文标题的歌曲时,有时候会看到乱码的现象,这是怎么回事? 要想知道答案,需要先了解下字符编码相关知识。 字符乱码问题...

    在Android系统设备中,如果有包含简体中文或繁体中文标题的歌曲时,有时候会看到乱码的现象,这是怎么回事?
    要想知道答案,需要先了解下字符编码相关知识。

    字符乱码问题由来

    PC出现的早期,不同国家或区域对自己的文字制定了编码规范,大家各自为政,没有标准化
    示例:
    编码方案A: 代码 100 内容:”###“
    编码方案B: 代码 100 内容:”@@@“
    问题出现了:将编码方案A编码的内容使用在编码方案B中,会显示预期之外的内容如乱码等。
    在此例子中,如果某文字用方案A编码,但是用方案B解码,则本应该显示”###“的文字会变成”@@@“


    如何解决编码问题?
    为解决各地区不同标准产生的编码问题,需要一种统一的编码方式,这便是ISO 10646和Unicode的由来。

    各种不同的编码

    1. ISO 10646
    ISO 10646标准由国际标准化组织ISO颁布,用来实现全球所有文种的统一编码;
    ISO 10646定义了标准字符集(Universal Character Set,UCS);
    历史上存在两个独立的尝试创立单一字符集的组织,即国际标准化组织(ISO)和多语言软件制造商组成的统一码联盟即Unicode。
    前者开发了ISO/IEC 10646 项目,后者开发了统一码项目。因此最初制定了不同的标准。
    1991年前后,两个项目的参与者都认识到,世界不需要两个不兼容的字符集。于是,它们开始合并双方的工作成果,并为创立一个单一编码表而协同工作。

    2.Unicode
    Unicode:统一码,为每一个字符定义唯一的代码(即一个整数);
    目前的 Unicode 字符分为 17 组编排, 每组称为平面(Plane),而每平面拥有65536个代码点;
    UCS-2即Unicode 0号平面字符集;
    Unicode字符平面映射 http://zh.wikipedia.org/wiki/Unicode%E5%AD%97%E7%AC%A6%E5%B9%B3%E9%9D%A2%E6%98%A0%E5%B0%84
    Unicode 编码表 http://zh.wikibooks.org/wiki/Unicode
    Unicode的实现方式称为Unicode转换格式(Unicode Transformation Format,简称为UTF),如UTF-16,UTF-8等;


    UTF-8: 
    8-bit Unicode Transformation Format,是一种针对Unicode的可变长度字符编码;

    UTF-8使用一至四个字节为每个字符编码:
     - ASCII字符只需一个字节编码;
     - 拉丁文等 需要二个字节编码; 
     - 其他基本多文种平面(BMP)中的字符三字节编码
     - 其他极少使用的Unicode 辅助平面的字符使用四字节编码

    Unicode和UTF-8之间的转换关系表 
             UCS-4编码           UTF-8字节流 
    U+00000000 – U+0000007F 0xxxxxxx 
    U+00000080 – U+000007FF 110xxxxx 10xxxxxx 
    U+00000800 – U+0000FFFF 1110xxxx 10xxxxxx 10xxxxxx 
    U+00010000 – U+001FFFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

    UTF-16: 
    16bit Unicode Transformation Format,把Unicode的码位转换为16比特长的码元;

    UTF-16是UCS-2的父集,在BMP中,UTF-16编码就等于UCS码;
    在辅助平面中,UTF-16使用“代理对”的方法进行编码;
    代理对编码方法:
      1.码位减去0x10000, 得到的值的范围为20比特长的0..0xFFFFF. 
      2.高位的10比特值加上0xD800,得到高位代理(范围0xD800..0xDBFF);
      3.低位的10比特值加上0xDC00,得到低位代理(范围0xDC00..0xDFFF);

    高位代理、低位代理、BMP中的有效字符的码位,三者互不重叠;

    字节序:
      - 不同平台使用不同字节序;
      - 为了确定UTF-16文件的大小尾序,在采用UTF-16编码文件的开头,都会放置BOM(Byte Order Mark)信息,FF FE代表UTF-16LE,FE FF代表UTF-16BE;
      - U+FEFF,U+FFFE字符在UNICODE中代表的意义是ZERO WIDTH NO-BREAK SPACE,它是个没有宽度也没有断字的空白;
      - U+6731,UTF-16LE编码为“31 67”,UTF-16BE编码为“67 31”; 

      


    3.ASCII
    American Standard Code for Information 美国信息交换标准代码;
    单字节编码,使用7位二进制数表示,编码范围为0 - 127,可表达128个字符;
    ASCII码字符不存在乱码问题,因为绝大部分地区编码都兼容ascii;

    扩展ASCII:
    标准ASCII码只用到一个字节中的7位,如果使用第8位,则可扩展编码范围128 - 255,扩展后的标准即为ISO8859-1,也称为 Latin-1

    4. ISO8859
    - ISO 8859,全称ISO/IEC 8859,是一个8位字符集的标准,现时定义了15个字符集
    - ASCII收录了空格及94个“可印刷字符”,足以给英语使用。但是,其他使用拉丁字母的语言(主要是欧洲国家的语言),都有一定数量的附加符号字母,故可以使用ASCII及控制字符以外的区域来储存及表示。
    - 兼容ASCII,0x20 - 0x7F为ASCII,0xA0-0xFF为ISO 8859-x字符
    - Unicode 0x00-0xFF范围的字符由 0x00-0x7F(ASCII) + 0x80-0x9F(控制符) + 0xA0-0xFF(ISO 8859-1)组成

    各种ISO 8859字符集 
    ISO/IEC 8859-1 (Latin-1) - 西欧语言 
    ISO/IEC 8859-2 (Latin-2) - 中欧语言 
    ISO/IEC 8859-3 (Latin-3) - 南欧语言。世界语也可用此字符集显示。 
    ISO/IEC 8859-4 (Latin-4) - 北欧语言 
    ISO/IEC 8859-5 (Cyrillic) - 斯拉夫语言 
    ISO/IEC 8859-6 (Arabic) - 阿拉伯语 
    ISO/IEC 8859-7 (Greek) - 希腊语 
    ISO/IEC 8859-8 (Hebrew) - 希伯来语(视觉顺序) 
    ISO 8859-8-I - 希伯来语(逻辑顺序) 
    ISO/IEC 8859-9(Latin-5 或 Turkish)- 它把Latin-1的冰岛语字母换走,加入土耳其语字母。 
    ISO/IEC 8859-10(Latin-6 或 Nordic)- 北日耳曼语支,用来代替Latin-4。 
    ISO/IEC 8859-11 (Thai) - 泰语,从泰国的 TIS620 标准字集演化而来。 
    ISO/IEC 8859-13(Latin-7 或 Baltic Rim)- 波罗的语族 
    ISO/IEC 8859-14(Latin-8 或 Celtic)- 凯尔特语族 
    ISO/IEC 8859-15 (Latin-9) - 西欧语言,加入Latin-1欠缺的芬兰语字母和大写法语重音字母,以及欧元(€)符号。 
    ISO/IEC 8859-16 (Latin-10) - 东南欧语言。主要供罗马尼亚语使用,并加入欧元符号。 
    由于英语没有任何重音字母(不计外来词),故可使用以上十五个字集中的任何一个来表示。


    6.代码页
    代码页(Code Page),也称“内码表”,是特定语言的字符集的一张表;
    早期,字符集编码信息存放在ROM中,被称为OEM代码页(IBM PC使用);
    微软针对不同的使用地区与国家,定义了一系列的支持不同语言字符集的代码页,被称作"Windows (或ANSI) 代码页";
    不同的厂商对同一个字符集编码使用各自不同的名称。例如,UTF-8在IBM称作代码页1208, 在微软称作代码页65001, 在SAP称作代码页4110;
    微软系统中,中日韩语言代码页:
    932 — 日文 (Shift-JIS)
    936 — 简体中文(GBK) 
    949 — 韩文 (EUC-KR)
    950 — 繁体中文(Big5)


    GB-x:简体中文编码
    GB2312:
    中华人民共和国国家标准简体中文字符集,共收录6763个汉字,覆盖中国大陆99.75%的使用频率

    对于人名、古汉语等方面出现的罕用字,GB 2312不能处理每个汉字及符号以两个字节来表示,兼容ASCII


    GB13000:
    Unicode BMP平面汉字。1993年,Unicode 1.1版本推出,收录中国大陆、台湾、日本及韩国通用字符集的汉字,总共有20,902个。

    中国大陆将之定为GB13000


    GBK:

    汉字内码扩展规范,K为汉语拼音 Kuo Zhan(扩展)中“扩”字的声母

    相当于GB 2312 + GB 13000。由于GB 2312-80只收录6763个汉字,有不少汉字并未有收录在内,于是厂商微软利用GB 2312-80未使用的编码空间,收录GB13000.1-93全部字符制定了GBK编码字符有一字节和双字节编码。对于单字节,00–7F范围即ASCII,对于双字节,第一字节的范围是81–FE,第二字节的范围在40–7E及80–FE


    GB18030:
    国家标准GB 18030-2005《信息技术 中文编码字符集》,是中华人民共和国现时最新的内码字集
    与GB 2312-1980完全兼容,与GBK基本兼容,支持GB 13000及Unicode的全部统一汉字,共收录汉字70244个

    Big5:繁体中文编码
    Big5,又称为大五码或五大码,繁体中文地区中最常用的汉字字符集,共收录13,060个汉字
    双字节字符集,“高位字节”使用了0xA1-0xF9,“低位字节”使用了0x40-0x7E,及0xA1-0xFE (CP950)
    由于很多日常用字未被收录(“着”,“柏”,“喆”等),所以在市面上支持Big5码的软件(如仓颉输入法),有不少都自行在原本的编码外,添加一些符号及用字


    编码检测

    如何知道当前字符是何种编码?
    不同代码页使用的代码范围不一样,通过检测代码范围来得到一个字符可能的编码。
    注意,中日韩等象形文字的编码范围有可能会有重叠部分,因此某个字符检测可能得到多个结果。
    如果是判断某个字符串,则可检测每个字符可能的编码,对每一个结果进行与操作,则可得到更准确的结果。


    编码          范围(只有部分信息,实际请参考代码页)
    Shift-JIS     高位字节0x81-0xFC,低位字节0x40-0x7E,…,0x -0xFC,
    GBK           高位字节0x81-0xFE,低位字节0x40-0x7E,0x80-0xFE
    Big5          高位字节0xA1-0xF9,低位字节0x40-0x7E,0xA1-0xFE
    EUC-KR        高位字节0x81-0xFD,低位字节0x41-0x5A,0x61-0x7A,0x81-0xFE

    注意编码范围不是连续的,因此在实现过程中,需要根据代码页把其所有范围列出来,检测编码时判断字符是否在该范围
    Android使用微软的代码页:http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/
    例:
    GBK编码范围
    {
     {0x8140,0x817E},
     {0x8180,0x81FE},
     {0x8240,0x827E},
     ...
    }


    编码转换

    ICU:International Components for Unicode,  Unicode国际化组件;

    官网:http://site.icu-project.org/

    开源软件,有两种版本:ICU4J(Java)和ICU4C(C,C++)
    ICU主要功能:
      代码页转换
      字符比较器(Collation)
      日期,时间,货币,数字等格式转换
      时区计算
      Unicode支持
      正则表达式
      处理文本排向(Bidi )
      文本边界

    ICU提供一个转换器,可以将代码页编码(如GBK)转换成Unicode编码
    同一种编码可能有多个别名,创建转换器时可以输入别名
    转换器别名信息可从android源码中获取,路径为: android/external/icu4c/data/mappings/convrtrs.txt 
    或者从该地址查看Demo: http://demo.icu-project.org/icu-bin/convexp


    使用ICU4C完成不同编码的转换
    步骤:
    1.创建转换器
    convDest = ucnv_open(name,…); //目标转换器,打开转换器如”GBK”,”UTF-8”,返回converter对象
    convSrc = ucnv_open(name,…);  //源转换器

    2.转换
    ucnv_convertEX(convDest,convSrc,pDest,pDestLen,pSrc,pSrcLen,…)

    3.关闭转换器
    ucnv_close(convDest);
    ucnv_close(convSrc);


    结论

    了解了字符编码相关知识后,再来看乱码现象。
    目前智能手机,平板等设备基本使用unicode字符集,对于unicode字符,可以正常显示,而非unicode字符则需要先转换成unicode,否则会显示乱码。
    在转换之前,需要检测编码。由于中日韩文字的编码有重叠部分,检测时有可能得到多个结果,因此在检测结果上还要加个条件,即根据当前设置的语言来决定最终结果。
    所以如果设置当前语言为简体中文,查看繁体中文或日韩文编码信息的歌曲时会看到乱码。
    抛开效率问题,这种情况其实可以解决,通过判断检测结果是否唯一,如果是则将对应编码转换成utf8即可。

    有些mp3歌曲信息是unicode编码,所以无论设置哪种语言都可以显示正确。


    展开全文
  • Oracle 数据库 字符乱码 解决办法

    千次阅读 2016-08-17 09:47:31
    Oracle 数据库 字符乱码 解决办法: 问题描述: 1、安装完成之后,还原之前的数据库,显示为乱码,因为在安装oracle 的时候与之前数据库的字符集不一至,导致业务乱码。 2、查询当前数据库字符集 SQL> SELECT...

    Oracle 数据库 字符乱码 解决办法:

    问题描述:

    1、安装完成之后,还原之前的数据库,显示为乱码,因为在安装oracle 的时候与之前数据库的字符集不一至,导致业务乱码。

    2、查询当前数据库字符集


    SQL> SELECT parameter, value FROM v$nls_parameters WHERE parameter LIKE '%CHARACTERSET';

    PARAMETER
    ----------------------------------------------------------------
    VALUE
    ----------------------------------------------------------------
    NLS_CHARACTERSET
    WE8MSWIN1252

    NLS_NCHAR_CHARACTERSET
    AL16UTF16

    3、需要将 字符集 由  WE8MSWIN1252 修改为 AL32UTF8

    4、修改SQL 代码


    conn /as sysdba
    shutdown immediate;
    startup mount
    ALTER SESSION SET SQL_TRACE=TRUE;
    ALTER SYSTEM ENABLE RESTRICTED SESSION;
    ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
    ALTER SYSTEM SET AQ_TM_PROCESSES=0;
    alter database open;
    ALTER DATABASE CHARACTER SET AL32UTF8;
    ALTER DATABASE character set INTERNAL_USE AL32UTF8;
    ALTER SESSION SET SQL_TRACE=FALSE;
    select * from v$nls_parameters; 
    shutdown immediate;
    startup

    注意:

    在执行,SQL> ALTER DATABASE character set INTERNAL_USE ZHS16GBK;

    --这个过程和之前ALTER DATABASE CHARACTER SET操作的内部过程是完全相同的,也就是说INTERNAL_USE提供的帮助就是使Oracle数据库绕过了子集与超集的校验.

    5、在oracle下 .bash_profile 文件里面加入
    export NLS_LANG="Simplified Chinese_CHINA.ZHS16GBK"

    

    
    展开全文
  • 最近做项目过程中要从数据库中读取一些字段,将这些字段先用实体类封装好,然后在其他java主程序中调用该字段进行匹配,奈何我操作了好几遍,总是显示数据库中中文字符乱码。数据中中样式如图1所示。 ...
  • new String(byte[] bytes)出现的字符乱码

    千次阅读 2019-10-17 11:20:29
    new String(byte[] bytes)出现的字符乱码 在new的时候,指定字符集即可
  • 安装zsh解决zsh下terminal终端字符乱码问题1 安装zsh2 修改主题并3 解决乱码其他 bash虽好,但zsh才是人们的最爱,无论是主题或者是记录命令的插件及高亮效果都是无与伦比的,如果你在安装zsh使用了某些主题后导致...
  • 中文字符乱码:UTF8、GB2312

    千次阅读 2016-07-06 15:45:03
    最近遇到两个中文字符乱码的问题: 1、使用sourceinsight 查看代码时,中文字符乱码 2、使用xssh远程登录Ubuntu系统时,中文目录乱码 首先说下字符集: 最常见的英文字符集是ASCii 最常见的中文字符集是GB...
  • SSH框架下中文字符乱码问题的研究

    千次阅读 2016-10-10 00:27:05
     在Java Web的应用中,中文字符乱码问题是个由来已久和让人头疼的问题,尤其是刚刚接触Java Web编程的人员,往往在解决中文字符乱码问题上花费了大量的时间和精力。  要了解Java中文乱码问题的产生原因,先要从...
  • Arcgis打开数据出现字符乱码问题解决方案—指导篇 问题描述 第一种:常见类型为使用Arcgis打开CAD文件出现文字乱码,不能正常显示 第二种:将已经打开的shp文件导出属性表出现属性表内容文字乱码 第三种:将shp...
  • 在实际开发中碰到一个非常头痛的问题,在js文件中向jsp页面传中文字符时碰见了一个字符乱码(get传递方式)。在传值时使用encodeURI进行了编码,然后再接收端(jsp)使用了URLDecoder.decode('','字符编码'),进行...
  • Ubuntu16.04中文字符乱码问题的解决方法: 一、打开终端,输入sudo gedit /etc/default/locale (或者直接打开该目录下对应的文件)。 二、将第一默认的字符编码改为utf-8: LANG=zh_CN.UTF-8 LANGUAGE=”zh_...
  • tomcat 字符乱码分析

    千次阅读 2018-07-08 09:50:03
    一、常识了解 1.GBK包含GB2312,即如果通过GB2312编码后可以通过GBK解码,反之可能... 二、中文乱码出现 在学习任何一门技术时,经常会有初学者遇到中文乱码问题,比如MySQL,是因为在安装时没有设置;而在Servl...
  • Eclipse编码设置(解决中文字符乱码)在导入别人的工程时,有时候会看到代码中的中文为乱码,为什么呢? 大家一般都能想到这个是字符编码的问题,但是要怎么解决呢? 修改Eclipse编码1.配置workspace的编码格式: ...
  • 乱码的问题,都知道是字符集的问题,需要查看数据库服务器的字符集和客户端的字符集   oracle数据库的字符集更改  A、oracle server 端 字符集查询  select userenv('language') from dual  其中NLS_CHA...
  • 特殊字符乱码问题

    千次阅读 2019-04-30 11:01:00
    建议用(标签可以控制转换特殊字符): <html:text property=“instruction” readonly=“true” styleClass=“mylongreadonly” size=“32”/> <input name=“instruction” type=“hidden” value="<...
  • 文件读写字符乱码的解决方案

    千次阅读 2013-08-18 09:24:36
    关于字符乱码,可能很多人在实际的开发过程中都会遇到。要解决它,既是一个简单的问题,又是一个复杂的问题。  简单是因为只要编码方式选对就可以从容的解决它,复杂也是复杂在编码方式的选择这里。  对于ANSI编码...
  • 网上在线转换成ascii utf8 都乱码
  • 解决QT中中文字符乱码问题,只需在main文件中添加几行代码即可。   QTextCodec::setCodecForTr(QTextCodec::codecForName("gb18030")); QTextCodec::setCodecForLocale(QTextCodec::codecForName("gb18030"))...
  • 传说C使用ansi编码导致在adb shell下查询中文字符乱码? 求证 这个应该是运行环境问题吧 在 linux 下很正常(默认utf8编码)01.coldljy@linux:~/dev/sourcery> adb shell mkdir /data/测试 02.coldljy@linux:~/dev/...
  • Debian菱形字符乱码问题

    千次阅读 2020-03-28 21:38:44
    解决debian系统中文字以菱形符号乱码显示的问题
  • SQLSERVER 特殊字符乱码

    千次阅读 2018-08-07 17:04:38
    特殊字符通过sql语句插入数据时,出现乱码.但使用ORM保存时没有问题. 可以在插入的语句前添加字符'N' 比如 insert into tablea (code) values (N'Ø123')
  • Qt5下socket传输中文字符乱码的问题

    千次阅读 2016-08-19 14:38:42
    Qt5下socket传输中文字符乱码的问题先贴代码server端部分代码QString msg = TextEdit->toPlainText(); qDebug(); qDebug()(); qDebug()().length(); int length = 0; if(msg=="
  • php获取url中文字符乱码

    千次阅读 2010-11-03 20:46:00
    咳,今天遇到一个问题获取URL中文字符乱码,搞了半天。 php中url地址栏传参数中文乱码解决方法汇总 php地址栏传中文$_GET下来后乱码,urlencode和urldecode用法详解 url编码 语法: string ...
  • 导致中文字符乱码,绝大多数情况是因为编码格式不匹配,因为cmd终端编码给是为GBK(ANSI)格式,而你编程的编码格式一般设置为utf8,所以需要修改cmd终端编码格式为utf8具体步骤如下: 1、打开cmd窗口,输入chcp ...
  • 其中,有个让我纠结的问题,就是字符乱码问题,今天终于处理好了,跟大家分享一下解决方法,顺便娴娴也算是做一个笔记,以后就不要纠结这种东东了。。。不过之前,我还想说 MySQL真变态(咳咳)  解决方法分为三个...
  • 解决 Javascript 中 atob 方法解码中文字符乱码问题 由于一些网络通讯协议的限制,你必须使用 window.btoa() 方法对原数据进行编码后,才能进行发送。接收方使用相当于 window.atob() 的方法对接受到的 ...
  • ubuntu下解压zip rar中文字符乱码的问题,解压zip rar中文乱码的问i题一直困扰着我,每次都要到window系统下解压,很是不方便,今天终于把这类问题解决了。整理总结分享下 一 . 解决 Rar 压缩文件乱码问题 Rar 压缩...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 36,066
精华内容 14,426
关键字:

字符乱码