|
Python と C/C++ と...
プログラ厶とスカートの丈はロングよりショートが好みです。
-
7
owa
2003/11/28 13:57
id: mJs8kxp1Zus
prob: 7.3%
-
-
>>6
すいません必要だったのは表示カラム数分のサイズでしたね;;
---
def columns_in_utf(s, cols):
size = len(s)
cpos = 0
bytes = 0
while (cols > 0) and (cpos < size):
c = ord(s[cpos])
if (c & 0x80) == 0:
bytes = 1
cols -= 1
elif (c & 0xe0) == 0xc0:
bytes = 2
cols -= 1 # 何カラム使うのかなぁ?
elif (c & 0xe0) == 0xe0:
bytes = 3
cols -= 2
else:
break
cpos += bytes
if (cols < 0) or (cpos > size):
cpos -= bytes
return s[:cpos]
---
と直してみました。一ヶ所出来てませんけど。
-
6
kiyo
2003/11/28 13:32
id: M4qDt4tUHP2
prob: 3.8%
-
-
>>4 こんなんじゃどうでしょう
http://fzug.com/fzug_prog/UTF で試してみました。
私の作ったScript
指定された文字及び長さ
--------------
漢1字ひ2らabcがなカ4896タ78901カナ, 20
--------------
返った文字 [ 漢1字ひ2らabcがなカ4 ]
utf-8での文字長さ [ 27 ]
切り取られた長さ [ 27 ]
owa さん作ったScript
呼び出し utfsize("漢1字ひ2らabcがなカ4896タ78901カナ",int(20 / 2 * 3))
指定された文字及び長さ
--------------
漢1字ひ2らabcがなカ4896タ78901カナ, 20
--------------
返った文字 [ 漢1字ひ2らabcがなカ4896 ] <-- len が 23 になる
utf-8での文字長さ [ 30 ]
切り取られた長さ [ 30 ]
呼び出し utfsize("漢1字ひ2らabcがなカ4896タ78901カナ",20)
指定された文字及び長さ
--------------
漢1字ひ2らabcがなカ4896タ78901カナ, 20
--------------
返った文字 [ 漢1字ひ2らabcが ] <-- len が 15 になる
utf-8での文字長さ [ 20 ]
切り取られた長さ [ 20 ]
文字範囲の指定が必要?
-
5
kiyo
2003/11/28 12:22
id: M4qDt4tUHP2
prob: 9.7%
-
-
>>4 こんなんじゃどうでしょう
おお、プロのコード綺麗だあー。
後で試してみます。
-
4
owa
2003/11/28 11:58
id: mJs8kxp1Zus
prob: 22.3%
-
-
とり急ぎ、こんなんじゃどうでしょう
---
def utfsize(s, size):
n = 0
while n < size:
c = ord(s[n])
len = 0
if c & 0x80 == 0:
len = 1
elif c & 0xe0 == 0xc0:
len = 2
elif c & 0xe0 == 0xe0:
len = 3
else:
break
if n + len > size:
break
n += len
return n
---
あとは後程...
-
3
kiyo
2003/11/28 09:48
id: M4qDt4tUHP2
prob: 0.0%
-
-
おはよう御座います。
>># chkutf8 の例外処理は必要なのかなー
buff[pos+1], buff[pos+2] を調べていますので、実際に存在しない領域をポイントしたら、エラーになると思ってそうしました。
>> 最初から辿らないと判定できないはずです。
今回のテキスト切り取りに関しては、必要ないような気もしますが、、、
切り取ろうとする位置が全角の一バイト目以外は処理する必要が無いような?
但し、utf-8 ではテキスト表現方法に3つのパターンがあるようです。(間違ってたら突っ込み希望)
-- 引用 --
まず,ISO 10646の「0000 0000〜0000 007F」(16進表記)までを「0xxx xxxx」(0と1のビット表記:ここでは1バイトになる)で表わす。
次の「0000 0080〜0000 07FF」までは,1バイト目を110,2バイト目を10で始める「1110
xxxxx 10xxx xxx」(2バイト)で表わす。
同様に次の「0000 0800〜0000 FFFF」は「1110 xxxx 10xx xxxx 10xx xxxx」(3バイト)で表わす。
こうすればASCII文字は1バイトで済み,「0000 0080〜0000 07FF(かなに相当する部分)」は日本語のひらがな・カタカナやヨーロッパの文字まで入れて2バイトで済む。さらに3バイトで漢字を含めたBMPが全部収まることになる。
----
この3つのパターンを python の len(xx) 関数及びスライスが utf-8 での正しい長さになりません。
んで、utf8len で切り取るポイントの長さ(utf-8 での)をテキスト先頭から調べて
is_utf8 で2バイト目又は3バイト目なのか調べて切り取るポイント位置を変更しているつもりです。
# ソースはとってもダサダサですがそんな気持ちで書いてます。
と書いていて気がついた。
utf-8 での len(xx) は正しくないから
while n < len(buff):
if int(pos / 2 * 3) < n:
break
は
while n < int(pos / 2 * 3):
と書くべきだな
pos / 2 * 3 は、utf-8 が全部3バイトだったときの切り取る最大の長さのつもりです
例えば pos が 8 だとすると、すべて全角文字なら pos / 2 で全角4個
この全角が全て3バイトとすると、4 * 3 = 12
# ここまで書くと失礼かも知れませんが、文章がヘタなので許して下さい。
-
2
owa
2003/11/27 23:04
id: mJs8kxp1Zus
prob: 0.0%
-
-
文字列の切り取りメソッドについて
(COREBlog から移動しました)
文字列の切り取りコードですが、私的には若干異論がありまして
1. 文字コードは最初から順に見て行かないと判定できない。
2. サイズで切る処理はもともと表示する用途が主なので、サイズは小さいだろう
このへんを出発点に考えていました。
# 作成するコードはその時の条件によって変化するので、
# utility.py がどうこうと云う話ではありません。
記憶に頼って書いて居るので間違いがあるかもしれませんが、
Shift_JIS, EUC-JP 何れも日本語の何バイト目かの判定は
最初から辿らないと判定できないはずです。(UTF8 は調べます)
# 約束はしませんが、Python コードは書こうと思ってます。
-
1
owa
2003/08/18 23:20
id: mJs8kxp1Zus
prob: 0.1%
-
-
zope 知るには python をしらなきゃだめ。
でも zope のコード読むと最後は C/C++ に行き着いてしまう。
zope は python の分身のはずじゃなかったの。
なんか違うなと思いながら、このコーナ作ってしまったけど、
書き込むのは自分だけだろうなー
|
|