老是有人弄什么一个中文字算两个西文字这种问题,一般而言这种问题是极其愚蠢的。为什么一个中文字要算两个西文字呢?
有些人做前端算宽度(比如显示标题要截掉一些字以免放不下),但是在绝大多数场景下,使用比例字体的西文的宽度是不等宽的,也不可能是中文字的一半宽。况且除了中文、西文,还有其他文字呢?比如藏文、维吾尔语等,你算一个还是两个?【不要跟我说你只考虑中英文,连少数民族的语言文字都他妈不支持,鸟语倒支持个起劲,还好意思说什么民族团结?】
对于标题截取这种需求,合理的对策是用CSS,对于CSS支持不够的,可以用脚本来计算。简单来说就是把一串字放在一个隐藏容器里量一下,然后截取到指定长度以内。如果用Canvas Text API,更是非常简单的。
另一些人说是要存数据库。但是他妈谁告诉你数据库里保存的时候就是一个中文字对两个西文字?拜托补习一下基本的编码常识。一个汉字对两个英文字母那都是古老的双字节编码了。不说Unicode,GB18030-2005包含70000+字符,显然会有超过双字节的情况。如果你还在用GB2312、GBK,那问题同上,怎么存藏文、维吾尔语等……
抛开这些本身就不合理的需求,但是仍然有少数需求是需要考虑汉字的特殊性的。那就是排版。在排版中,汉字(准确说是中日韩越文字)是直接按照方块字来排的,而其他语言的字符通常要变宽处理。
那么到底哪些字符是方块呢?
如果看看输入法就知道,一直到现在我们都还有全角(Fullwidth)、半角(Halfwidth)的区分。全角就是方块字,而半角则是半个方块字。实际上这是从legacy encoding+早期等宽字体遗留下来的。在Unicode规范里,对东亚字符的这种特殊属性做了更详细的阐述,具体可参考:
http://unicode.org/reports/tr11/。
这里就简单的根据Unicode数据库来给出到底哪些字符是“全角字符”。
1100..115F
11A3..11A7
11FA..11FF
2329,232A
2E80..4DBF (去掉303F)
4E00..A4CF
A960..A97F
AC00..D7FF
F900..FAFF
FE10..FE1F
FE30..FE6F
FF01..FF60
FFE0..FFE7
1F200..3FFFF
以正则表达式来写就是:
/[\u1100-\u115F\u11A3-\u11A7\u11FA-\u11FF\u2329\u232A\u2E80-\u303E\u3040-\u4DBF\u4E00-\uA4CF\uA960-\uA97F\uAC00-\uD7FF\uF900-\uFAFF\uFE10-\uFE1F\uFE30-\uFE6F\uFF01-\uFF60\uFFE0-\uFFE7]/
注意,U+303F虽然是在CJK标点符号区,但是只有它却不是全角的,这个罕用符号表示半个汉字的空间。
另外U+3248到U+324F严格说也不是全角的,在Unicode规范里归为(A)mbiguous类,意思是在特定上下文里(如东亚文本里)可以是全角的,而在其他上下文里则是半角的。A类的字符还有很多,比如双引号、间隔号等,在西文字体里都有这些字符,当然也不可能是按照全角方块字来设计的。
因为实际的字符宽度取决于语言及字体选择等因素,所以我暂时并不直接将A类归入全角。只有U+3248到U+324F在大多数字体里根本都不支持,因此就马虎点按全角算了。
分享到:
相关推荐
Excel 快速实现半角字符替换为全角字符 在 Excel 中,半角字符和全角字符的使用是非常常见的。半角字符是指ASCII 码表中的字符,而全角字符则是指 Unicode 码表中的字符。在实际工作中,我们经常需要将半角字符替换...
### 半角与全角字符的转换 #### 知识点概述 在计算机科学与编程领域,字符编码是一项基础而重要的技术。字符编码涉及到字符如何被表示为二进制数字,以便于计算机处理和存储。根据不同的编码方式,相同的字符可能...
在DOS下或者单片机应用中,要显示较少的汉字和全角字符,为了节省空间,通常是建立小字库。而建立小字库第一步就是提取程序中需要显示的汉字。由于是在源程序中检索,必须考虑绕过程序中用于注释的汉字。提取C语言中...
C#中提供了两个函数,分别用于将半角字符转换为全角字符(ToSBC)和将全角字符转换为半角字符(ToDBC),这两个函数对于理解和处理中文字符的显示非常有帮助。 半角字符通常是指ASCII字符集中的字符,它们在屏幕上...
在计算机编码系统中,字符通常有两种不同的宽度:全角(Full-width)和半角(Half-width)。全角字符主要用于亚洲语言环境,如中文、日语等,每个字符占用两个字节空间;而半角字符则用于英文等拉丁字母环境,每个...
"全角":这个标签强调了补丁关注的是全角字符的处理问题,这在处理亚洲语言时尤其重要,因为这些语言通常使用全角字符。 **压缩包子文件的文件名称列表解析** NDP20-KB925488-X86.msp:这是一个Microsoft Service ...
如何判断你在C语言程序中是否输入的是汉字
根据给定文件的信息,本文将详细介绍“全角转半角”、“半角转全角”以及如何判断一个字符是否为全角的相关知识点。 ### 一、全角与半角的基本概念 在计算机处理中文文本时,经常会遇到全角(Full Width Character...
标题中的“vb 汉字全角字符点阵提取源码”指的是使用Visual Basic(VB)编程语言编写的代码,其主要功能是处理汉字的全角字符,并从中提取出点阵信息。在计算机图形学中,点阵是一种将字符表示为二维像素网格的方法...
全角字符转为半角字符的算法: 全角字符 - 半角字符 = 0xA380 全角空格A1A1 -> 半角空格0x20 附件为C源程序
C++全角半角字符转换
全角字符点阵提取是IT领域中一种特定的技术,主要用于处理和显示汉字,尤其是在通信设备如LED显示屏或LCD显示器上。这种技术的核心是将全角的汉字字符转换为点阵形式,以便在有限的像素空间内清晰地呈现汉字。点阵...
解决任何情况下的全角、半角字符转化问题,有效的控制程序中出现全角半角问题。方法简单,易懂。
### 正则表达式判断是否存在中文和全角字符 在处理文本数据时,尤其是在需要确保数据安全性与准确性的场合下,判断字符串中是否含有中文字符或全角字符是非常重要的。以下是一些关键知识点: #### 1. 正则表达式...
全角字符是指在字符编码中占用较多字节空间的字符,多见于日文和中文的编码体系,常见于字符和符号的显示宽度为两个标准ASCII字符宽。半角字符则是占用较少字节空间的字符,一般是标准的ASCII字符,其显示宽度与英文...
MySQL存储全角字符和半角字符的区别主要体现在字符编码、占用空间和显示效果上。在MySQL中,字符数据类型如`CHAR`、`VARCHAR`等是用来存储文本信息的,它们会根据选择的字符集来处理字符。对于半角字符,通常指的是...
全角字符从的unicode编码从65281~65374 半角字符从的unicode编码从 33~126 空格比较特殊,全角为 12288,半角为 32 而且除空格外,全角/半角按unicode编码排序在顺序上是对应的 所以可以直接通过用+-法来处理非空格...
### 对全角半角字符串的处理 在计算机编程与数据处理领域中,全角和半角字符的区别及其转换是一项常见的需求。特别是在东亚语言环境中(如中文、日文、韩文等),这种转换对于文本处理至关重要。 #### 全角与半角...
【VS2005全角补丁】是一个针对微软Visual Studio 2005开发环境的更新,旨在解决中文输入时可能出现的全角字符显示和处理问题。在编程过程中,尤其是处理中文字符串时,全角字符(全宽度字符)与半角字符(半宽度字符...