HOME | ドキュメント |  ブログ  |  BBS  |  瓦版  | 将棋プロジェクト |  物置小屋   

ドキュメント 象歩 Web瓦版
 BBSボード RDF
こんにちは (23)
おためし板 (321)
質問箱 (94)
テスト (30)
You散歩 (4)
建築 DIY (6)
MTB (32)
(9)
節電対策 (2)
このサイトに関する話 (186)
Linux (396)
PC用ハードウェア (6)
Vine Linux 野良系 (64)
PC 工作 (31)
ドローン (0)
自家製GAFA (0)
BBS の改良 (105)
Vine Seed (520)
Zope とプロダクト (95)
Web の利用技術 (131)
DB とファイルシステム (63)
Python と C/C++ と... (29)
Zopeプロダクト開発メモ (3)
UTF-8 化 (42)
Mail 環境 (8)
COREBlog (109)
Zope3 (51)
Windows 64bit (18)
Mac (2)
Squeak スクイーク (67)
Django ぶらり一人旅 (3)
64bits (52)
Mono 思いにふける (10)
Mint Linux (6)
CentOS (2)
ディスクトップ (4)
象歩将棋 (478)
将棋よもやま (210)
サイトのデザイン (31)
心配な話 (66)
うそ (21)
うそ総集編 (0)
昔のゲストブック (20)
ボート部 (23)
Web 日記 (199)
 スパム
逮捕しる (20)
スパムお溜り (47)
ごみ箱 (6)
 リンク
kiyoさんのサイト
ペンタ郎の漫漕ブログ
端艇部員日記
TIT漕艇部の練習動画 @YouTube
墨堤の雄 @FaceBook
ペンタ(五大学ミドル) @FaceBook
Facebook
Vine Seed パッケージビルド状況
Vine Linux パッケージ情報
VineLinux バグトラッキングセンタ
VineSeed 開発用 Trac
VineSeed Specs
RPMパッケージの作成方法
Linux Standard Base
Planet Vine
Vine Linux ユーザーフォーラム
Vine Users ML アーカイブ
VineSeed ML アーカイブ
twitter#VineLinux
勝手に将棋トピックス
詰将棋おもちゃ箱

Python と C/C++ と...

プログラ厶とスカートの丈はロングよりショートが好みです。


このまま記事を入力し[投稿する]ボタンを押せば当サイトに送信されます。 以下の文章は注意書きです。

名前はかならず記入してください。ハンドルネームでも構いません。 またパスワードを入力することをお勧めします。 その場合他人による *なりすまし* と区別出来るかもしれません。 さらにブラウザでクッキーを有効に設定してある場合あなたの記事は後で修正可能になります。

コメントスパム防止のため記事の内容を機械的にモデレート (スパムである確率を計算) する処理を通します。 どのような投稿であれ、たまたま計算誤差によりスパムとみなされ 秘密の場所 に収納される可能性があります。 その場合、管理人が手作業で正規の場所に移動しますのでお待ちください。

名前  パスワード(任意)

全29件 - 01 02 03 04

8  kiyo  2003/11/28 15:58 id: M4qDt4tUHP2  prob: 0.1%
>>7 
充分なテストではないですが、今のところ問題なさそうです。
しかし owa さんすごいなあー
僕のソース消して正解(見なかった事にして下さい)
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 の分身のはずじゃなかったの。
なんか違うなと思いながら、このコーナ作ってしまったけど、
書き込むのは自分だけだろうなー