字元寬度資料庫:
字元寬度文件:
文件中定義了unicode字元的顯示寬度如下:
a : ambiguous 不確定
f : fullwidth 全形
h : halfwidth 半形
n : neutral 中性
na : narrow 窄
w : wide 寬
總體來說:
in a broad sense, wide characters include w, f,
and a (when in east asian context), and narrow characters include n, na, h,
and a (when not in east asian context).
其中比較難處理的是a型別,典型的字元是中文的引號。
中文輸入法所謂「半形中文引號」其實是a,在有的場合下和乙個英文本元等寬,
有的場合和乙個漢字等寬。
這裡由於使用需要,認為a型別與乙個漢字等寬。
#!/usr/bin/env python3
#-*- coding: utf-8 -*-
east_asian_width =
ilast = 0
jlast = 0
ealast = 1
def eaw_operation(i, j, ea, f):
global ilast
global jlast
global ealast
# 如果與上一範圍寬度不同,列印上一範圍並記錄當前範圍
# 否則當前範圍併入上一範圍
if ealast != east_asian_width[ea]:
print(' , {}}},'.format(jlast, ealast), file=f)
ilast = i
ealast = east_asian_width[ea]
jlast = j
if __name__ == '__main__':
with open('eastasianwidth.txt', 'r', newline='\n') as database, open('east_asian_width.table', 'w', encoding='utf-8') as f:
print('eaw_data east_asian_width = , {}}}'.format(jlast, ealast), file=f)
print('};', file=f, end='')
然後east_asian_width.table裡就是uncode範圍與對應寬度。
我在專案裡這麼用:
#include "windows.h"
#include namespace eaw_data;
#include "east_asian_width.table"
const int tablesize = sizeof(east_asian_width) / sizeof(eaw_data);
/** * @brief 乙個字元的顯示寬度
* @param 字元的unicode值
* @return 字元的顯示寬度,1或2
**/int eaw(int value)
else if(value == east_asian_width[imid].value)
else
imid = (imin + imax) / 2;
}}} // anonymous namespace
/** * @brief 計算字串的顯示寬度
* @param s 字串,必須以'\0'結尾
* @return 字串的顯示寬度,以乙個半角字元的寬度為單位
* * 函式內部先轉換字串為unicode再計算
* 在ansi工程中巨集eaw_len被定義為eaw_len_a
**/int eaw_len_a(char *s)
/** * @brief 計算字串的顯示寬度
* @param s 字串,必須以l'\0'結尾
* @return 字串的顯示寬度,以乙個半角字元的寬度為單位
* * 在unicode工程中巨集eaw_len被定義為eaw_len_w
**/int eaw_len_w(wchar_t *s)
return len;
}
因為是windows專案,所以用winsdk轉碼,非windows用libiconv吧。
eaw_len是乙個巨集,unicode時為eaw_len_w,非unicode時為eaw_len_a。
然後在呼叫處:
// 假定字元的寬度為6px
int len_visible = eaw_len(some_str);
len_visible = len_visible > 20 ? 120 : len_visible * 6;
J2ME 根據顯示寬度分割字串
將乙個長字串根據指定寬度和字型分割成字串陣列 param longstring 用於分割的較長字串 param font 用於測量字串寬度的字型 param width 顯示裝置上單行字串的寬度 return 分割成的字串陣列 private string splitlongstringintost...
c 自動計算字串的寬度
測試 string str 字串 var width textrenderer.measuretext str,this font var width2 this.creategraphics measurestring str,this.font str 字串 時,結果為 width width2...
c 自動計算字串的寬度
測試 string str 字串 var width textrenderer.measuretext str,this font var width2 this.creategraphics measurestring str,this.font str 字串 時,結果為 width width2...