字串的顯示寬度

2021-06-27 07:39:24 字數 2542 閱讀 5359

字元寬度資料庫:

字元寬度文件:

文件中定義了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...