V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
liuguangxuan
V2EX  ›  程序员

请教各位老哥,有没有讲字符编码与字符集的书籍推荐?

  •  
  •   liuguangxuan · 262 天前 · 1851 次点击
    这是一个创建于 262 天前的主题,其中的信息可能已经有所发展或是发生改变。

    有关字符编码和字符集的概念,一直是云里雾里的,虽然知道一些 Ascii 、Unicode 、UTF-8 、GBK 、单字节、多字节、宽字符、char 、wchar_t 、string 、wstring 等知识,但是并不能完全将他们串起来,特别是涉及到他们之间进行转换的时候,一旦在项目中,碰到乱码的问题,就觉得无从下手。

    请各位有经验的老哥推荐一些这方面的书籍。如果书中有 C/C++示例就更棒了。

    36 条回复    2023-10-07 10:47:57 +08:00
    jiaqizhang
        1
    jiaqizhang  
       262 天前
    《编码》?
    Noicdi
        3
    Noicdi  
       262 天前 via iPhone   ❤️ 2
    AlanStar
        4
    AlanStar  
       262 天前
    你在国内做东西的话知道 UTF-8 ,GBK 什么的就够了,不用知道太多,字符编码这个东西本质上就是用一套编码体系来映射文字和符号。
    看 OP 的描述应该是做 C/CPP 开发的,我是做嵌入式开发的,建议你还是能不用中文输出就不用,对嵌入式设备来说输出中文有点浪费资源,print 也就是提示使用者程序的运行进度而已,也不必要必须是中文。

    如果你必须这么做的话,有几个建议:
    1.你可以用支持 Unicode 字符集的编译器(GCC/Clang)之类,但是需要在编译过程中加选项才可以。
    2.可以在对应文件首部添加 // -*- coding: utf-8 -*- 来声明文件使用 UTF-8 编码。
    3.也有在运行前在终端上执行 chcp 65001 这个命令的,我自己有试过但是好像不太尽人意。
    4.可以引入宽字符集<wchar.h>,这条在网上搜到的,我没用过,OP 可以自己查查。
    hxy2856
        6
    hxy2856  
       262 天前
    @AlanStar 老哥 插个楼问一问 嵌入式最近是不是需求量很大?什么原因啊,我看 8 月份招聘量挺高的 https://www.jobui.com/trends/quanguo-qianrushi/
    AlanStar
        7
    AlanStar  
       262 天前
    @hxy2856 这个我还真不太清楚,我觉得应该是和国家宏观战略有关,做芯片搭边的产业可能会有额外补贴。
    AlanStar
        8
    AlanStar  
       262 天前
    @hxy2856 我现在在做大数据开发,主要是学校不好我现在实习都不敢找嵌入式这种起点高的。
    Jakarta
        9
    Jakarta  
       262 天前 via Android
    @Noicdi #2 我的收藏夹里也是这篇文章😂
    iOCZ
        10
    iOCZ  
       262 天前   ❤️ 1
    字符集是一个字符对应哪个整数,编码是怎么存这个整数,这个整数可能会很大,需要多个字节来存。说白了,就这么回事。https://liyucang-git.github.io/2019/06/17/%E5%BD%BB%E5%BA%95%E5%BC%84%E6%87%82Unicode%E7%BC%96%E7%A0%81/
    ysc3839
        11
    ysc3839  
       262 天前 via Android
    字符集:ASCII Unicode GBK(没看过标准文档,不确定 GBK 是不是字符集和编码一起规定了)
    因为目前绝大多数计算机内部存储、处理的是二进制数值,所以要给不同的字符编上序号,所有编好号的字符组成字符集。
    字符编码(字符对应的整数在计算机内的二进制编码方案):UTF-8 UTF-16 GBK 7bitASCII
    计算机处理二进制数据时是有一定限制的,比如有位长度限制(16bit, 32bit 等),有存储器最小访问长度限制(byte bits ,单字节位长度,目前主流计算机是 8bit),所以要根据不同限制,把字符序号转换成计算机能处理的数据。比如 7bit ASCII 是用于 byte bits>=7 的计算机,一个字符使用且最多使用一个字节,属于单字符单字节的编码方案。UTF-8 则是单字符多字节。
    char:应该是 C/C++语言的概念,是一个主要用于表示字符的整数类型,一般来说长度是 1 字节。
    宽字符、wide char 、wchar_t:应该也是 C/C++语言的概念,一般是能存储 Unicode 字符的整数类型,一般来说长度是 2 或 4 字节。
    hxy2856
        12
    hxy2856  
       262 天前
    @AlanStar 感谢~ 猜是政策问题
    liuguangxuan
        13
    liuguangxuan  
    OP
       262 天前 via Android
    @jiaqizhang 感谢老哥推荐好书,收藏了。
    大致看了一下目录,感觉这本应该偏计算机组成原理。
    iX8NEGGn
        14
    iX8NEGGn  
       262 天前   ❤️ 1
    正打算写,从 19 年到现在,我看了上千个网页,几十本包括 Unicode 、ISO/IEC 、中国的 GB 系列在内的 PDF 文档,写了二十多万字的笔记,正在重新整理安排如何由浅入深的介绍。

    看得越多越发现我可能永远也学不会字符编码了,因为要精通全世界各国语言才能明白它为什么这么设计,以及一些早期的文档已经找不到,但我还是有很大的把握能写出一篇全网讲得较为明白的长文或书。

    顺便问下,由于有的地方需要一些佐证,有没有好心人能借用 ISO/IEC 会员,我想把历年来所有 ISO/IEC 字符编码标准下载下来。
    xmuli
        15
    xmuli  
       262 天前   ❤️ 1
    此两篇应该足够,① 详细讨论分析,②工作快速对照。
    从起因分析,到 C++ 在 MSVC / MinGW 下的代码验证。甚是符合题主的提问。

    ①极繁根因分析 --> 愿编程不再乱码(含 Qt)-根因深究 [★★★★★] https://ifmet.cn/posts/c0862e62

    ②极简图表解释 --> 古文码、口字码、符号码、问号码、棍拷码 [★★★★★]
    https://blog.csdn.net/qq_33154343/article/details/99617767

    且若是额外有兴趣可看 Github QtExamples 的第六章
    dandycheung
        16
    dandycheung  
       262 天前 via Android
    好多好多年前,有一篇《字节那些事儿》: https://blog.csdn.net/dandycheung/article/details/5881620
    cnbatch
        17
    cnbatch  
       262 天前   ❤️ 1
    自己手动转换基本上不可能,等于重新造一个 ICU (International Components for Unicode),不如直接调库吧
    12345tiger
        18
    12345tiger  
       262 天前 via Android
    @hxy2856 可能是国产仪器需求带动的。现在大力提倡科学仪器国产化,从几十块的小设备到几百上千万的核磁、质谱,所有都优先采购国产,这需求不就一下子出来了吗
    hxy2856
        19
    hxy2856  
       261 天前
    @12345tiger 应该就是这个原因
    vaaagle
        20
    vaaagle  
       261 天前
    SmiteChow
        21
    SmiteChow  
       261 天前
    其实就是两个概念,理解了就没什么了。
    hxysnail
        22
    hxysnail  
       261 天前   ❤️ 1
    我之前写过一篇博客,可以参考一下: https://fasionchan.com/posts/coding/
    koebehshian
        23
    koebehshian  
       261 天前
    维基百科看看就行了,配合 hexdump 一下
    Feedmo
        24
    Feedmo  
       261 天前
    unicode explained
    karott7
        25
    karott7  
       261 天前
    直接维基百科看
    weeei
        27
    weeei  
       259 天前
    如果是 Windows 使用 VS 开发,需要注意,源文件使用的编码是跟随当前操作系统的,比如你用简体中文版本,源文件里面的字符串字面量就是 GB1080 ,如果用了繁体字面量在台湾版本的 Windows 下显示是不正常的,这里的原因就需要继续了解文字编码和语言字体的关系了。
    weeei
        28
    weeei  
       259 天前   ❤️ 1
    另外 UTF-8 、UTF-16 和 UTF-32 不是 32 > 16 > 8 的关系,UTF-16 是个有缺陷的编码方式,不能表示全部字符集。只有 UTF-8 和 UTF-32 可以。只要记住结论 UTF-8 最牛逼就行了。
    liuguangxuan
        29
    liuguangxuan  
    OP
       253 天前
    @Feedmo #24 请问一下老哥,《 Unicode Explained 》这本书有中文版吗?
    liuguangxuan
        30
    liuguangxuan  
    OP
       253 天前
    @dandycheung #16 感谢老哥,这篇博文主要讲述的是字节,我想了解的是编码。不过还是谢谢~
    liuguangxuan
        31
    liuguangxuan  
    OP
       253 天前
    @xmuli #15 老哥,你给推荐的博文特别棒,正是我所需要的,非常感谢老哥。
    还有此类高质量的博文吗?麻烦再给推荐一些吧,如果有此方面的书籍,就更棒啦~
    liuguangxuan
        32
    liuguangxuan  
    OP
       253 天前
    @iX8NEGGn #14 老哥写了之后麻烦通知一下啊,等着拜读您的著作。
    另外可否推荐几篇您读过的一些高质量的博文?如果有这方面的书籍就更棒啦~
    liuguangxuan
        33
    liuguangxuan  
    OP
       253 天前
    @Noicdi #3 感谢老哥推荐的好文章,都一一看完了。老哥还有推荐的类似的高质量文章吗?书籍也可以哈。
    xmuli
        34
    xmuli  
       253 天前
    @liuguangxuan https://github.com/XMuli/QtExamples 乱码和编码部分属于第六章; 部分写的比较早期,希望可以帮助到你
    Noicdi
        35
    Noicdi  
       253 天前   ❤️ 1
    @liuguangxuan #33 我当时也是工作上碰到了字符编码相关的问题,找到了这两篇文章大概看了一下,手上也没有类似的文章了。但是感觉可以在楼主的评论区里学到好多啊哈哈哈。感谢楼主的问题和各位老哥的回复。
    Feedmo
        36
    Feedmo  
       252 天前
    @liuguangxuan 中文版我没找着,技术书的英文大多都没那么难读懂的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1134 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 23:41 · PVG 07:41 · LAX 16:41 · JFK 19:41
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.