精华内容
下载资源
问答
  • 中文编码 1:常见中文编码格式

    万次阅读 2018-07-18 19:24:45
    为什么要有中文编码格式?  最早的ASCII码只包括了字母、标点符号、特殊字符等127个字符。这些字符对于拉丁语系国家的人使用是足够的,但是对于非拉丁语系国家(如中国、日本等),ASCII码就远远不够了。因此就...

    为什么要有中文编码格式?

            最早的ASCII码只包括了字母、标点符号、特殊字符等127个字符。这些字符对于拉丁语系国家的人使用是足够的,但是对于非拉丁语系国家(如中国、日本等),ASCII码就远远不够了。因此就需要编码来表示大量的汉字字符。

    常用的几种中文编码格式:

    1、Unicode编码

               Unicode编码通常由两个字节组成,称作USC-2,个别偏僻字由四个字节组成,称作USC-4。前127个还表示原来ASCII码里的字符,只不过由一个字节变成了两个字节。

    优点:可以囊括多国语言,囊括了常用汉字

    不足:表示一个英文字符由一个字节变成了两个,浪费存储空间和传输速度。生僻字表示不足

    2、UTF-8编码

                Unicode编码的一种,Unicode用一些基本的保留字符制定了三套编码方式,它们分别为UTF-8,UTF-16,UTF-32.在UTF-8中,字符是以8位序列来编码的,用一个或几个字节来表示一个字符。这种方式的最大好处是UTF-8保留了ASCII字符的编码作为它的一部分。UTF-8俗称“万国码”,可以同屏显示多语种,一个汉字通常占用3字节(生僻字占6个)。为了做到国际化,网页尽可能采用UTF-8编码。

    3、GB2312编码

    GB2312简体中文编码,一个汉字占用2个字节,在大陆是主要的编码方式。当文章/网页中包含繁体中文、日文、韩文等时,这些内容可能无法被正确编码。

    作用:国家简体中文字符集,兼容ASCII

    位数:使用2个字节表示,能表示7445个符号,包括6763个汉字,几乎覆盖所有高频率汉字。

    范围:高字节从A1-A7,低字节从A1到FE。将高字节和低字节分别加上0xA0即可得到编码。

    4、BIG5编码

    称为繁体中文编码,主要在台湾地区使用。

    5、GBK编码

    作用:它是GB2312的扩展,加入对繁体字的支持,兼容GB2312.

    位数:使用2个字节表示,可表示21886个字符。

    范围:高字节从81到FE,低字节从40到FE.

    6、GB18030编码

    作用:它解决了中文、日文、朝鲜语等的编码,兼容GBK。

    位数:它采用变字节表示(1ASCII, 2,4字节)。可表示27484个文字。

    范围:1字节从00到7F;2字节高字节从81到FE,低字节从40到7E和80到FE;4字节第一三字节从81到FE,第二四字节从30到39.

     

     

    参考:

    [1] https://blog.csdn.net/qiqiaiairen/article/details/51535262

    [2] https://www.jb51.net/article/92006.htm

    展开全文
  • C++:中文编码转换

    万次阅读 多人点赞 2018-07-13 19:47:42
    C++11标准库,中文编码转换问题。

    在介绍如何使用C++11标准库进行中文编码转换之前,先说一下byte string、multibyte string、wide string之间的区别。

    byte string

    由8比特的字节组成的字符串。由char表示字节。因而字符串长度=字节数=char数

    multibyte string

    在内存布局上与byte string相同。但是由于它是区域(locale)相关的,所以它有可能表示的是UTF-8, GB18030, EUC-JP, Shift-JIS等格式的字符串,而这些格式中的每个字码(codepoint)可能是由多个连续的char组合构成的,所以字符串长度=字码数,但!=char数,也!=字节数。

     wide string

    每个宽字符由于操作系统的不同,其宽度为16位或32位的多语言字符代码。格式分别采用unicode(UTF-16LE)、UTF-16、UTF-32,由wchar_t, char16_t, char32_t表示。

    C++标准库中对应关系:

    char *        std::string
    wchar_t*   std::wstring
    char16_t*  std::u16string
    char32_t*  std::u32string

    1.string与wstring互相转化

    C++标准库从C++11开始提供了std::codecvt_utf8和std::codecvt_byname两个转换器来完成编码转换,可使用的通用代码如下:

    #include <string>
    #include <locale>
    #include <codecvt>
    
    // string的编码方式为utf8,则采用:
    std::string wstring2utf8string(const std::wstring& str)
    {
        static std::wstring_convert<std::codecvt_utf8<wchar_t> > strCnv;
        return strCnv.to_bytes(str);
    }
    
    std::wstring utf8string2wstring(const std::string& str)
    {
        static std::wstring_convert< std::codecvt_utf8<wchar_t> > strCnv;
        return strCnv.from_bytes(str);
    }
    
    // string的编码方式为除utf8外的其它编码方式,可采用:
    std::string wstring2string(const std::wstring& str, const std::string& locale)
    {
        typedef std::codecvt_byname<wchar_t, char, std::mbstate_t> F;
        static std::wstring_convert<F> strCnv(new F(locale));
    
        return strCnv.to_bytes(str);
    }
    
    std::wstring string2wstring(const std::string& str, const std::string& locale)
    {
        typedef std::codecvt_byname<wchar_t, char, std::mbstate_t> F;
        static std::wstring_convert<F> strCnv(new F(locale));
    
        return strCnv.from_bytes(str);
    }
    
    

    如果是GBK string与wstring互相转化,locale可取值:

    linux下:

    zh_CN.GBK
    zh_CN.GB2312
    zh_CN.GB18030

    windows下:

    标准格式的locale:
    Chinese_China.936
    zh-CN
    .936
    非标准格式的locale:
    chs
    Chinese-simplified
    Chinese
    ZHI
    不能使用的locale:
     Chinese.936,chs.936,Chinese.GB2312,chs.GB18030等此类值。

    下面通过一些例子说明上面的函数如何使用吧。

    2.string与wstring如何输出到控制台

    代码页为936

    以在windows控制台为例,举例说明:

    // testCode.cpp
    #include <string>
    #include <iostream>
    #include <fstream>
    #include <codecvt>
    #include <locale>
    
    int main() {
    	std::wstring txt = L"中国人";
    
    	std::wcout << txt << endl;
    }

    程序编译后在中文版windows中运行结果:

    控制台使用的代码页为936(也就是GBK编码),输出结果为乱码。因为txt是unicode,而控制台是GBK编码,乱码是由于没有做编码转换造成的。

    修改代码,添加一个转换器:

    int main() {
    	std::wstring txt = L"中国人";
    	wcout.imbue(std::locale(std::locale("Chinese"), new std::codecvt_byname<wchar_t, char, std::mbstate_t>("Chinese")));  
    	// wcout.imbue(std::locale("Chinese")); 
    	// 也可以简写成这种形式,其中默认带了std::codecvt_byname<wchar_t, char, std::mbstate_t>("Chinese")转换器
    	
    	std::wcout << txt << endl;
    }

    此时,输出结果就正常了。

    如果修改代码页为65001(也就是UTF-8编码),再执行如下代码:

    int main() {
    	std::wstring txt = L"中国人";
    
    	std::wcout << txt << endl;
    }

    会发现没有结果输出,说明从unicode到utf-8没有转换成功。

    修改代码,添加一个转换器:

    int main() {
    	std::wstring txt = L"中国人";
    	wcout.imbue(std::locale(std::locale("Chinese"), new std::codecvt_utf8<wchar_t>()));
    	
    	std::wcout << txt << endl;
    }

    此时,结果正确输出了:

    由于wstring是unicode,它转换到其它编码格式,只需要使用一次转换器就可以了,但如果使用的是string,又该怎样做转换?比如使用如下代码:

    int main() {
    	std::string txt = u8"中国人";
    
    	std::cout << txt << endl;
    }

    在代码页为936的情况下,执行输出为乱码:

    修改代码,添加两个转换器:

    int main() {
    	std::string txt = u8"中国人";   // string的编码格式为utf-8
    
    	std::wstring wtxt = utf8string2wstring(txt);    // 将utf-8的string转换为wstring
    	std::string txt_gbk = wstring2string(wtxt, "Chinese");    // 再将wstring转换为gbk的string
    
    	std::cout << txt_gbk << endl;
    }

    此时,输出结果正常:

    代码页为65001

    再修改一下代码:

    int main() {
    	std::string txt = "中国人";
    
    	std::cout << txt << endl;
    }

    在代码页为65001的情况下,执行无输出,说明执行结果失败:

    添加两个转换方法再试试:

    int main() {
    	std::string txt = "中国人";
    
            std::wstring wtxt = string2wstring(txt, "Chinese");
            std::string txt_uft8 = wstring2utf8string(wtxt);
    
    	std::cout << txt_uft8 << endl;
    }

    在代码页为65001的情况下,执行成功:

    使用std::wcout试一下:

    int main() {
    	std::string txt = "中国人";
    
    	std::wstring wtxt = string2wstring(txt, "Chinese");
    	wcout.imbue(std::locale(std::locale("Chinese"), new std::codecvt_utf8<wchar_t>()));
    
    	std::wcout << wtxt << endl;
    }

    在代码页为65001的情况下,执行结果正常:

    再举一个保存到文件的例子:

    int main() {
    	std::string txt = "中国人";
    
    	std::wstring wtxt = string2wstring(txt, "Chinese");
    	std::string txt_uft8 = wstring2utf8string(wtxt);
    
    	std::ofstream of("D:/temp/text.txt");
    
    	of << txt_uft8 << endl;
    }

    以上代码执行成功,并将字符串以utf-8保存到文件了。

    再使用如下代码试试:

    int main() {
    	std::string txt = u8"中国人";
    
    	std::ofstream of("D:/temp/text.txt");
    
    	of << txt << endl;
    }

    也能以utf-8保存到文件。

    3.在输入输出流中使用编码转换

    除了直接使用转换器做字符串之间的转换外,如果用到的输入与输出流,则可以直接在输入输出流上配置需要的转换器。上面已经有多个例子了,这里再补充一个例子,代码如下:

    #include <iostream>
    #include <fstream>
    #include <string>
    #include <locale>
     
    int main()
    {
        // text.txt是UTF-8编码的文件
        std::wifstream fin("D:/temp/text.txt");
        // 文件输入流中使用UTF-8转换器
        fin.imbue(std::locale(std::locale("zh-CN"), new std::codecvt_utf8<wchar_t>()));
        // 控制台输出流中使用GBK转换器
        std::wcout.imbue(std::locale(std::locale("zh-CN"), new std::codecvt_byname<wchar_t, char, std::mbstate_t>("Chinese_China.936")));
        
        for (wchar_t c; fin.get(c); ) {
            std::wcout  << c << endl;
        }
    }

    以上是在windows上可执行的代码 ,如果要在Linux上运行,只需要把Chinese_China.936替换成zh_CN.GBK即可。

    4.char* 与wchar_t*互相转化

    在C++11之前,C++标准库中提供了如下两个函数进行编码转换。需要说明的是,这两个函数在windows下不支持UTF-8,而在Linux下是可以支持UTF-8的:

    #include <cstdlib>
    
    std::size_t mbstowcs( wchar_t* dst, const char* src, std::size_t len);
    std::size_t wcstombs( char* dst, const wchar_t* src, std::size_t len);

    windows不支持UTF-8的原因,据说是因为这两个函数一开始只支持ANSI内的多字节编码方式,而ANSI内的多字节编码方式的特点是每个字符不超过两个字节,后来utf-8出现后,由于UTF-8中的字符是有可能超过两个字节的,如果要加入UTF-8,会对现在函数做大量修改,因此Microsoft没有让这两个函数支持UTF-8。也可以说,这两个函数不认为UTF-8是多字节编码方式。

    以下为Linux下可以运行的代码:

    #include <iostream>
    #include <clocale>
    #include <cstdlib>
    int main()
    {
        std::setlocale(LC_ALL, "en_US.utf8");
        std::wcout.imbue(std::locale("en_US.utf8"));
    	
        const char* mbstr = u8"中国人";
    	
        wchar_t wstr[5];
        std::mbstowcs(wstr, mbstr, 5);
        std::wcout << "wide string: " << wstr << '\n';
    }
    
    #include <iostream>
    #include <clocale>
    #include <cstdlib>
     
    int main()
    {
        std::setlocale(LC_ALL, "en_US.utf8");
        // UTF-8 narrow multibyte encoding
        const wchar_t* wstr = L"中国人";
    	
        char mbstr[11];
        std::wcstombs(mbstr, wstr, 11);
        std::cout << "multibyte string: " << mbstr << '\n';
    }

    如果要在windows上使用与UTF-8相关的编码转换,也可以考虑使用如下函数,只不过这将失去平台移植性:

    MultiByteToWideChar
    WideCharToMultiByte
    void mbtowchar(const char* input, wchar_t* output) {
      int len = MultiByteToWideChar(CP_UTF8, 0, input, -1, NULL, 0);
      MultiByteToWideChar(CP_UTF8, 0, input, -1, output, len);
    }

    总结

    从C++11开始,标准C++库引入相关API,提供了标准的字符编码转换方式,方便开发者开发跨平台的字符编码转换代码。然而,上述代码中使用的wstring_convert、codecvt_utf8已在C++17被弃用了,至于由什么来替代,C++标准中没有说,现在只好继续使用它们,等待新的C++标准出来了。

     

    参考文档

    String and Character Literals (C++)
    Locale Names, Languages, and Country/Region Strings
    Locale Names
    Code Page
    Language Strings
    Country/Region Strings
    char, wchar_t, char16_t, char32_t
    MultiByteToWideChar function
    WideCharToMultiByte function

    Unicode part 1: Windows console i/o approaches
    Unicode part 2: UTF-8 stream mode

    Unicode转UTF-16
    UTF-8 Everywhere
    The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets

    setlocale()

    The Complete Guide to C++ Strings, Part I - Win32 Character Encodings
    The Complete Guide to C++ Strings, Part II - String Wrapper Classes

    展开全文
  • Python 中文编码

    千次阅读 2016-09-08 23:15:47
    ”,英文没有问题,但是如果你输出中文字符”你好,世界”就有可能会碰到中文编码问题。Python 文件中如果未指定编码,在执行过程会出现报错:#!/usr/bin/python print "你好,世界";以上程序执行输出结果为:File ...

    现象描述

    我们用 Python 输出 “Hello, World!”,英文没有问题,

    但是如果你输出中文字符”你好,世界”就有可能会碰到中文编码问题。

    Python 文件中如果未指定编码,在执行过程会出现报错:

    #!/usr/bin/python
    print "你好,世界";

    以上程序执行输出结果为:

    File "test.py", line 2
    SyntaxError: Non-ASCII character '\xe4' in file test.py on line 2, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details

    Python中默认的编码格式是 ASCII 格式,在没修改编码格式时无法正确打印汉字,所以在读取中文时会报错。


    解决办法

    解决方法为只要在文件开头加入 # -*- coding: UTF-8 -*- 或者 #coding=utf-8 就行了。

    实例(Python 2.0+)

    #!/usr/bin/python
    # -*- coding: UTF-8 -*-
    
    print "你好,世界";

    输出结果为:

    你好,世界

    这里写图片描述

    所以如果使用2.+的版本代码中包含中文,就需要在头部指定编码。

    展开全文
  • 繁体中文和简体中文编码

    千次阅读 2019-03-06 23:29:17
    繁体中文和简体中文编码 中文编码遇到问题 内存(Hex) 43 00 3a 00 5c 00 55 00 73 00 65 00 72 00 73 00 5c 00 6c 00 69 00 75 00 5c 00 44 00 65 00 73 00 6b 00 74 00 C.:..U.s.e.r.s..l.i.u..D.e.s.k...

    繁体中文和简体中文编码

    中文编码遇到问题

    内存(Hex)
    43 00 3a 00 5c 00 55 00 73 00 65 00 72 00 73 00 5c 00
    6c 00 69 00 75 00 5c 00 44 00 65 00 73 00 6b 00 74 00 C.:..U.s.e.r.s..l.i.u..D.e.s.k.t.
    6f 00 70 00 5c 00 1a 90 53 90 2c 6e 66 8a 31 00 32 00
    33 00 5c 00 72 00 65 00 73 00 2e 00 6a 00 70 00 67 00 o.p…?S?,nf?1.2.3…r.e.s…j.p.g.

    标记Unicode1// 程序获取 获取的是简体中文

    内存(Hex)
    43 00 3a 00 5c 00 55 00 73 00 65 00 72 00 73 00 5c 00
    6c 00 69 00 75 00 5c 00 44 00 65 00 73 00 6b 00 74 00 C.:..U.s.e.r.s..l.i.u..D.e.s.k.t.
    6f 00 70 00 5c 00 1a 90 53 90 4b 6d d5 8b 31 00 32 00
    33 00 5c 00 72 00 65 00 73 00 2e 00 6a 00 70 00 67 00 o.p…?S?Km??1.2.3…r.e.s…j.p.g.

    标记Unicode2
    PS:最好统一输入,统一输入简体中文或者统一输入繁体中文,如果一般输入简体一半输入繁体,用window系统函数转换会出问题。

    编码判断

    百度api识别结果包含其他国文字(如:\uc601),window下python写txt,默认转gbk,如韩文转gbk,所以出现encode失败,需要过滤筛选

    #中文Unicode编码判断,范围\u4e00~\u9fa5
    def containCHN(str):
        for ch in str:
            if not '\u4e00' <= ch <= '\u9fa5':
                return False
        return True
    
    展开全文
  • 常见编码格式(中文编码

    万次阅读 2016-05-30 08:01:28
    中文编码主要有以下四种: GB2312简体中文编码,一个汉字占用2个字节,在大陆是主要的编码方式。当文章/网页中包含繁体中文、日文、韩文等时,这些内容可能无法被正确编码。 BIG5繁体中文编码,主要在台湾地区使用...
  • 当我新建个普通的.java文件的时候,如果我们想对url进行编程,那么我们要将中文编码成UTF8,这个是java自己默认的编码方式,如果我们将中文强制用GBK编码,那么会出现错误。我们可以这样理解,其实android修改了java...
  • pyspark的中文编码问题

    千次阅读 2019-08-02 15:11:23
    用python读入一个字典,然后对spark SQL dataframe对中文做处理的时候,匹配不到,这个是中文编码问题。 python2.x 可用utf-8编码,但是pyspark是用unicode编码的,所以涉及数据交互的时候必须用进行编码和解码; ...
  • StrngEntity中文编码问题

    千次阅读 2018-10-23 15:56:39
    最近在调查系统中一个有关中文编码的问题,发现了一些坑,最终定位了是有着HTTP编码的问题。 最开始问题是这样的,我们有A/B/C三个系统,A系统发出的内容包含了中文,通过Tcpdump抓包发现B系统接收到的Http中的内容...
  • python中文编码中文乱码问题

    万次阅读 多人点赞 2016-11-22 01:19:34
    多次因为python的编码/乱码问题困扰,相信也是pythoner都被困扰过,每次出点问题网上铺天盖地的资料太多也参差不齐,就整理了下。本从使用的角度系统总结了python相关的一些概念,相信本文的例子玩一遍,基本上对...
  • String.getBytes()方法中的中文编码问题 String的getBytes()方法是得到一个系统默认的编码格式的字节数组。 getBytes("utf-8")得到一个UTF-8格式的字节数组。 把String转换成bytes,都是将一个string类型的字符串...
  • python解决中文编码问题

    万次阅读 2017-04-19 16:41:47
    python解决中文编码问题 摘要:因为这段时间做python的中文数据梳理和爬虫,中文数据处理花费了我大量的时间,暂时不做这一块所以留下一些记录。为了快速完成文章,这里对很多文章进行了引用和摘抄,敬请原谅。 ...
  • HttpClient 请求参数中文编码问题

    千次阅读 2017-12-25 15:56:36
    HttpClient 请求参数中文编码问题
  • python(2)中文编码乱码问题

    千次阅读 2020-01-11 15:08:56
    python(2)中文编码乱码问题一、什么是字符编码。1.ASCII2.GB23123.Unicode4.UTF-8二、Python2中的字符编码三、decode()与encode()方法四、一个字符编码的例子 **前言:**中文编码问题一直是程序员头疼的问题,而...
  • 最近,在处理中文编码的数据的时候,遇到了一些还是令人头疼的问题。 乱码! 乱码!! 乱码!!! 稍微整理一下处理过程,顺带着记录一下解决方案啥的……
  • Js实现中文编码与解码功能

    千次阅读 2016-11-05 11:46:57
    在网页的url中,我们经常会遇到明显的中文,这样的传输会遇到很多问题,...中文编码 function init() { console.log("init()"); var btn_escape=document.getElementById("btn_escape"); btn_escape.onclick=f
  • python 字典转字符串 中文编码问题

    千次阅读 2019-05-29 17:31:11
    python 字典转字符串 中文编码问题 字典转字符串 json.dumps() 中文编码问题: json.dumps(huoshan_dict["filter_words"], ensure_ascii=False)
  • 过滤器解决中文编码问题

    千次阅读 2015-12-28 19:13:49
    Servlet过滤器解决中文编码问题
  • R语言读写中文编码方式

    万次阅读 多人点赞 2015-06-11 09:35:04
    R语言读写数据的方法很多,这里...常见的中文编码方式两种:GBK(GB2312)和UTF-8。  Windows系统下:  read.csv()和read.table()方法不指定文件格式时,默认读取的文件是GBK格式。Rstudio里面有设置默认文本编码方式
  • 网址链接中的中文编码 中文的gbk(GB2312)编码: 一个汉字对应两组%xx,即%xx%xx 中文的UTF-8编码: 一个汉字对应三组%xx,即%xx%xx%xx 可以利用百度进行URL编码解码 默认gbk ......
  • 简单解决Python文件中文编码问题

    千次阅读 2017-10-17 18:39:26
    这篇文章主要介绍了简单解决Python文件中文编码问题的相关资料,需要的朋友可以参考下 读写中文 需要读取utf-8编码的中文文件,先利用sublime text软件将它改成无DOM的编码,然后用以下代码: with codecs....
  • 设置SublimeText支持中文编码

    千次阅读 2017-11-21 01:23:34
    设置SublimeText支持中文编码1. 安装 Package Control 菜单栏 –> View –> Show Console 如果是SublimeText3, 那么复制下面一段话粘贴到Console中: import urllib.request,os,hashlib; h = '6f4c264a24d933ce...
  • CentOS下设置中文编码设置: 1:安装支持中文: yum -y group install chinese-support 2:修改字符编码配置文件: 默认设置为英文: [root@Tony_ts_tian sysconfig]# pwd /etc/sysconfig [root@Tony_ts_tian ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 81,974
精华内容 32,789
关键字:

中文编码