ユニコード関数につきましてNo.30104
thasegawa さん 11/08/24 17:31
 
お世話になっております。
ユニコードの関数につきまして、ご質問させてください。

出版物のデータを扱っているため、S-JIS範囲外の文字を扱う場合が多いのですが、w
cslen() などユニコード関連の関数を使用して変数内の文字を操作しようとすると、
正しい文字数などが得られないものがあります。
CJK互換漢字補助 2F800〜2FA1D の範囲が1文字が2文字などにカウントされてしま
うようなのですが、これは仕方ないのでしょうか?

また、それに対する対処方法などもしありましたら、お教えください。

よろしくお願いいたします。

[ ]
RE:30104 ユニコード関数につきましてNo.30106
いいじま さん 11/08/24 18:29
 
いいじま@秀丸ユーザです。

> wcslen() などユニコード関連の関数を使用して変数内の文字を操作しようとすると、
> 正しい文字数などが得られないものがあります。
> CJK互換漢字補助 2F800〜2FA1D の範囲が1文字が2文字などにカウントされてしま
> うようなのですが、これは仕方ないのでしょうか?
>
> また、それに対する対処方法などもしありましたら、お教えください。

Windows内部では昔から今までずっと、Unicodeは1文字16ビットでした。

そのあと追加されたU+10000以降の文字については、1文字16ビットの環境では、
16ビットの範囲内のコードのうち、空いていた領域のコードを2つペアにして
表現することになっています。
(Linuxのように1文字32ビットの環境では起きない問題です。)

ですので、この拡張法のことを考慮に入れていない実装では、1文字のはず
なのに2文字扱いになってしまう、という現象が発生しうることになります。


正確なところは秀丸担当さんからコメントがあるでしょうけど、
とりあえず情報提供しておきます。

[ ]
RE:30106 ユニコード関数につきましてNo.30107
秀丸担当 さん 11/08/25 09:00
 

> wcslen() などユニコード関連の関数を使用して変数内の文字を操作しようとすると、
> 正しい文字数などが得られないものがあります。
> CJK互換漢字補助 2F800〜2FA1D の範囲が1文字が2文字などにカウントされてしま
> うようなのですが、これは仕方ないのでしょうか?

U+10000以上のUnicode文字は、いいじまさんの言われる通り16bitを1文字とする
解釈においては2文字として数えられてしまいます。

文字数を数える目的のものとしては、charcountという関数があります。
全角をどうのように数えるか、半角をどうのように数えるなどを個別に指定でき
ます。
(ただwcslenのように文字列を渡すものではなく、編集中のテキスト全体または
範囲選択を対象としています)

[ ]
RE:30107 ユニコード関数につきましてNo.30108
thasegawa さん 11/08/25 14:20
 
>U+10000以上のUnicode文字は、いいじまさんの言われる通り16bitを1文字とする
>解釈においては2文字として数えられてしまいます。
>
>文字数を数える目的のものとしては、charcountという関数があります。
>全角をどうのように数えるか、半角をどうのように数えるなどを個別に指定でき
>ます。
>(ただwcslenのように文字列を渡すものではなく、編集中のテキスト全体または
>範囲選択を対象としています)

お世話になっております。
お返事いただきましてありがとうございます。

マクロでそれぞれの文字がShift-JISコード内の文字か範囲外かを判断する必要があ
る場合、編集中のテキストファイルであればループ処理でカーソル移動させて文字
コードを取得すれば判断できますが、変数の文字列に同じように1文字ずつShift-JI
Sコード内の文字か範囲外かを判断する必要が出てくる場合があり、いろいろ考えた
のですが手詰まりで困っている感じです。

5〜6年ほど前から、業務で出版物のデータから抜き出したテキストの処理を補助する
ため、複雑な正規表現を裏側で自動作成して置換したり、置換辞書を作って自動保存
したりするマクロを組んで使用してもらっていたのですが、ここにきてユニコードに
対応する必要が出てきて、辞書ファイルにINIファイルを使用していたため、Shift-J
IS範囲外の文字を文字コードなど保存可能な文字列に置き換える必要がありまして、
いろいろ処理方法を考えたのですが。

文字コードはほんとうに難しいですね...。

[ ]
RE:30108 ユニコード関数につきましてNo.30109
秀丸担当 さん 11/08/25 17:18
 

>マクロでそれぞれの文字がShift-JISコード内の文字か範囲外かを判断する必要があ
>る場合、編集中のテキストファイルであればループ処理でカーソル移動させて文字
>コードを取得すれば判断できますが、変数の文字列に同じように1文字ずつShift-JI
>Sコード内の文字か範囲外かを判断する必要が出てくる場合があり、いろいろ考えた
>のですが手詰まりで困っている感じです。

確かに文字列を直接参照してやるには十分ではない点があります。
今後の課題にさせていただきます。
現状でやるとしたら、あまりスマートではないですが、いったんinsert $str;
といった感じで編集中のテキストにして処理するといろいろできると思います。

[ ]
RE:30109 ユニコード関数につきましてNo.30110
thasegawa さん 11/08/25 19:22
 
>確かに文字列を直接参照してやるには十分ではない点があります。
>今後の課題にさせていただきます。
>現状でやるとしたら、あまりスマートではないですが、いったんinsert $str;
>といった感じで編集中のテキストにして処理するといろいろできると思います。

お返事いただきましてありがとうございます。
何とか解決方法を見つけたいと思います。

これまで秀丸エディタのマクロでたくさんのプログラムを作って、業務改善や自動化
を行なってきましたが、秀丸エディタがなければ実現できなかったことは多く。(田
楽DLLさんにも大変お世話になってますが)
C#でもプログラムを作りますが、テキストを扱うのは奥が深いというか、文字コード
やコード表、そのコードの歴史やバリエーション(後付け仕様)、までも理解した上
でプログラムを作らなくてはいけないというのは、本当に大変だな〜と思っています。

今後ともよろしくお願いいたします。

[ ]
RE:30106 ユニコード関数につきましてNo.30111
thasegawa さん 11/08/25 19:41
 
>いいじま@秀丸ユーザです。
>
>Windows内部では昔から今までずっと、Unicodeは1文字16ビットでした。
>
>そのあと追加されたU+10000以降の文字については、1文字16ビットの環境では、
>16ビットの範囲内のコードのうち、空いていた領域のコードを2つペアにして
>表現することになっています。
>(Linuxのように1文字32ビットの環境では起きない問題です。)
>
>ですので、この拡張法のことを考慮に入れていない実装では、1文字のはず
>なのに2文字扱いになってしまう、という現象が発生しうることになります。
>

テキストは奥が深いですよね...。
文字コードやその歴史、コード表や追加仕様、ビット、バイト、オーダーマークとか、
そんな事ばかり考えてると、もうなんか頭パンパンです。
アイデアやアルゴリズムにだけ集中して、「面倒な理論は出来るだけ避けて通りたい
タイプ」なんで、こういうとこ勉強不足を痛感する日々...。
ありがとうございます。

[ ]