`
yayv
  • 浏览: 1578 次
  • 来自: ...
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

D语言的UTF支持

阅读更多
    这几天在做一个读取UTF8文件的功能,其中包括中英文。
 
   在UTF8中,不同的字符集下的字符宽度是不等的,比如 英文和符号都用1个Byte来表示,中文就需要用2-3个byte来表示,因此在从一个UTF8字符串中获取一个字符的时候就需要先判断该字符应该占几个字节。

   根据UTF8 编码, 首字节的编码包含了整个字符占用几个字节的 信息,参见下表(右边一栏为UTF8编码)

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
U-00200000 - U-03FFFFFF: 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
U-04000000 - U-7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
xxx 的位置由字符编码数的二进制表示的位填入. 越靠右的 x 具

知道了这些知识,基本就可以自己写段代码出来来截取所需要的字符个数了。
D 代码
 
  1. int u8CharWidth(char[] u8string, uint start)    
  2. {    
  3.    
  4.   
  5.     if((u8string[start] & 0xFE) == 0xFC)    
  6.     {    
  7.         return 6;    
  8.     }    
  9.         
  10.     if((u8string[start] & 0xFC) == 0xF8)    
  11.     {    
  12.         return 5;    
  13.     }    
  14.     
  15.     if((u8string[start] & 0xF8) == 0xF0)    
  16.     {    
  17.         return 4;    
  18.     }    
  19.     
  20.     if((u8string[start] & 0xF0) == 0xE0)    
  21.     {    
  22.         return 3;    
  23.     }    
  24.     
  25.     if((u8string[start] & 0xE0) == 0xC0)    
  26.     {    
  27.         return 2;    
  28.     }    
  29.     
  30.     if((u8string[start] & 0x80) == 0x00)    
  31.     {    
  32.         return 1;    
  33.     }    
  34.     
  35.     return -1;    
  36. }    

这个功能在 D语言的标准库 phobos 中是有的, 参见  std.utf 包的 stride函数。

在std.utf包中,这个功能使用了一个 256个自己的查找表,直接查找返回字节长度。

不过,上面的代码也好还是 std.utf 包中的函数也好,都没有对后续字节进行验证,并不能保证指定宽度的字节是一个正确的utf8字符。这一点还需要使用者在使用时自行判断。

另:在 std.utf 包中常用的 utf 字符处理的功能都有了,只需要简单组合就可以实现自己的应用了,很是方便。
分享到:
评论

相关推荐

    UTF-16汉字编码表

    - **U+5300** 至 **U+53FF**:这个范围内包括了“ߺͬ߸߹˱֨ڽ߻߼߽߾Ż߿ԱǺζզӽ”等字符,展示了UTF-16不仅支持汉字,还支持其他多种语言的字符。 - **U+5400** 至 **U+54FF**:这一段同样包含了多个字符,...

    gb2312_unicode_utf8汉字编码对照表

    它支持世界上几乎所有语言的文字,包括汉字在内。Unicode定义了一种统一的编码空间,每个字符都被分配了一个唯一的数字代码点。目前最常用的Unicode版本为UCS-2(16位)和UCS-4(32位),分别使用2字节和4字节来存储...

    D语言材料

    1. **源字符集检测**:检查源文件的字符集,D语言接受ASCII和UTF格式。 2. **脚本行处理**:如果第一行以`#!`开头,则该行被视为脚本执行命令,将被忽略。 3. **词法分析**:将源文件分解为一系列的标记(tokens),...

    常用汉字utf-8字符集.txt

    3. **国际化与本地化**:在开发面向全球用户的软件或网站时,支持多语言环境,尤其是包含复杂汉字的亚洲语言,是用户体验的重要一环。 4. **教育与学习资源**:对于汉字教学,提供标准的汉字字符集有助于学习者...

    HTML中unicode字符串转UTF-8

    - 在许多编程语言中,如JavaScript、Python、Java等,都有内置的函数或者库支持Unicode和UTF-8之间的转换。例如,在JavaScript中,可以使用`decodeURI()`或`decodeURIComponent()`函数解码Unicode字符串;在Python...

    Qt中的字符编码转换:UTF8、Unicode、GBK、ASCII、16进制字符、16进制数值

    在Qt开发中,字符编码转换是一项关键任务,尤其是在处理跨平台和多语言支持时。本文主要探讨了在Qt中如何进行UTF8、Unicode、GBK、ASCII、16进制字符和16进制数值之间的转换。 首先,让我们简单回顾一下各种编码...

    linux下设置mysql字符集为UTF-8以及mysql重启.docx

    在Linux环境中,MySQL数据库系统是广泛使用的开源关系型数据库管理系统。为了支持多语言或特定字符...通过这些操作,你可以确保在Linux上的MySQL数据库能够正确处理和存储UTF-8编码的数据,提供更加便捷的多语言支持。

    BatUTF8Conv.exe 文件批量转换为utf-8格式

    UTF-8是一种广泛应用的Unicode字符编码,能支持全球多种语言的文字,包括中文。在处理文本文件时,尤其是批处理脚本(Bat文件)时,确保文件编码格式的一致性是必要的。"BatUTF8Conv.exe"工具就是专门为了帮助用户...

    UTF8和GB2312文本格式相互转化的小工具

    在IT领域,文本编码是处理数据时不可或缺的一部分,尤其是在处理多语言内容时。本文将深入讲解UTF8和GB2312两种文本编码格式,并介绍如何进行相互转换,以及使用"Convertencoding.exe"这个小工具进行批量操作。 ...

    DEDE 5.7改进版utf-8

    7. **国际化支持**:DEDE 5.7改进版utf-8可能增强了多语言支持,方便创建和管理多语言站点。 8. **性能提升**:通过代码优化,提升了系统运行效率,减少内存占用,使网站在高访问量下也能保持稳定。 文件名称...

    python中的utf问题

    UTF-8支持全球几乎所有的字符集,并且对于英文等ASCII字符集具有向后兼容性,因此成为了Web和操作系统中最常用的编码方式之一。在Python中,默认字符串类型是基于UTF-8编码的,这为处理国际化文本提供了极大的便利。...

    JAVA字符编码:Unicode,ISO-8859-1,GBK,UTF-8编码及相互转换

    Unicode是一种国际字符编码标准,旨在支持世界上几乎所有语言的文字。它为每个字符分配一个唯一的数字,这个数字称为代码点。Unicode最常用的变体是UTF-8、UTF-16等。在Java中,字符串默认使用Unicode编码,每个字符...

    Crestron Mobile iPad多国语言支持解决方案

    - **步骤C**: 编辑解压文件中的[项目文件名_Resource.xml],例如[ipad4v7_Resource.xml],将“encoding='ISO-8859-1'”改为“encoding='UTF-8'”,以支持多国语言编码。 - **步骤E**: 使用记事本另存为UTF-8编码...

    Android-清除utf8bom的IntellijIDEA插件

    UTF-8编码是一种广泛使用的字符编码标准,它能够支持全球大部分语言的字符。然而,UTF-8有三种形式:无BOM(Byte Order Mark)、带BOM的UTF-8(UTF-8 with BOM)和UTF-8签名。带BOM的UTF-8文件会在文件开头添加一个...

    D_Programming_Language

    - **目标**:D语言的目标是创造一种既高效又易于使用的语言,同时避免C和C++中的一些设计缺陷。 - **社区反馈**:D语言的发展过程充分考虑了社区的反馈意见,这使得该语言能够更好地满足实际开发需求。 #### 三、D...

    关于Servlet、Jsp中的多国语言显示

    例如,中文字符串“中文测试”在GB2312编码下会被编码为"%D6%D0%CE%C4%B2%E2%CA%D4",而在UTF-8编码下则变为"%E4%B8%AD%E6%96%87%E6%B5%8B%E8%AF%95"。在Servlet中,可以使用`URLDecoder.decode`方法解码URL中的参数...

    Confluence中文语言包的安装过程

    为了满足不同地区用户的使用需求,Confluence提供了多种语言支持,其中就包括中文语言包。本文将详细介绍Confluence中文语言包的安装过程。 #### 二、准备工作 在开始安装中文语言包之前,请确保您的系统中已经...

    go语言语言语言语言语言

    Go语言支持直接将逻辑表达式的值赋给布尔类型的变量。 3. **if语句中的前置子句是可选的**:错误。Go语言中的if语句必须包含一个前置条件表达式。 4. **for语句中的后置子句是可选的**:正确。Go语言的 `for` 循环...

    D-YAML:D编程语言的YAML解析器和发射器

    D:YAML是D编程语言的开源YAML解析器和发射器库。 它符合YAML 1.1规范。 D:YAML基于Kirill Simonov创建的 。 D:YAML旨在易于使用,同时支持YAML的全部功能集。 要在项目中开始使用它,请参阅《 。 产品特点 易于...

    Linux下实现UTF-8和GB2312互相转换的方法

    2. **GB2312**: 是中国大陆地区的一种汉字编码标准,主要支持简体中文字符集,是早期计算机系统中的主流编码方式之一。 3. **iconv**: 是一个用于字符集转换的库函数,在Linux等类Unix系统中广泛使用。它提供了iconv...

Global site tag (gtag.js) - Google Analytics