- PR -

日本語入り文字列の位置

投稿者投稿内容
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-04-20 23:31
引用:

未記入さんの書き込み (2005-04-20 22:19) より:
引用:
「あいう----abcde」これは10バイトじゃないです。14バイト


何を言ってるのかまったく分からないです・・・。TomScissors さんが括弧で括ったのは までで、それを 10バイトと言っているように思います↓

引用:
「あいうえお」の10バイト5文字分が必ず全角文字。




はい。「あいう----」で14バイト。10バイト固定領域に「あいうえお」だとスペースがない。「あいう」の3文字だったら「あいう----」となる、という話ですよね。.NET Framework上では、10バイト分だと、「あいう----」ではなく、「あいう--」です。0x20の空白は、1バイトではなく、0x00と0x20の2バイトです。


引用:
答えは不明じゃなかったでしたっけ? エンコーディングが示されていないので。JIS で制御コードが入ると 14バイト超えますよね?


その通り!!失敗失敗


引用:
でも、Jitta さん自身もなんらかの前提(おそらくSJIS)のもとに、14バイトという話をしているわけで。それに VB6.0 の話が出ているところを見ると、バイト数換算については SJIS 前提で話を進めて(今回の流れでは)問題ないように思います。


いえ。Shift_JISではなく、特に明記していない限り、一貫して日本語版Windows上で使う、.NET FrameworkのChar構造体で表される文字です。だって、.NET Framework上での質問ですよね?
 それで、Shift_JISでいいのかな?とは思ったのですが、Shift_JISで書かれたファイルを読んで、それをUnicodeにエンコードし、そして「Shift_JISのバイト数とUnicodeのバイト数が一致しない」という問題なら、エンコードする前に分けてしまえばすむ問題だと思います。なので、違うと判断しました。
 足りなければ埋められる、ということなので、データベースだと判断しました。それならば、ADO.NETかドライバか、どこかでUnicodeに変換され、それを意識しないで使っているのだろうと判断しました。
 もっとも、それであっても、1フィールドずつ持ってきていればTrimですむはずで、それが私の一番最初だったのですが。


引用:

引用:
半角や全角はない、っちゅうこと


いや、いわゆる半角、いわゆる全角は Unicode でも存在しますね。どちらも 2バイトであらわされる(UTF-16 の場合)というだけの話であって。


すみません、削ってしまいました。"どちらも2バイト"の意図です。
ただ、プロポーショナルフォントを使うと、全角、半角も、ないと思います。これは固定ピッチフォントだからちょうど半分になるわけですから。
未記入
ぬし
会議室デビュー日: 2004/09/17
投稿数: 667
投稿日時: 2005-04-21 07:23
引用:
「あいう----」で14バイト。(中略) .NET Framework上では、10バイト分だと、「あいう----」ではなく、「あいう--」です。


なので、半角スペース2つを全角スペースひとつに置換しておけば(かなり条件が限定されるけど)切り出し位置はズレなくなりますよね、という話なのでは。

引用:
0x20の空白は、1バイトではなく、0x00と0x20の2バイトです。


Windows との相性を考えると、おそらく UTF-16LE で 0x20 と 0x00 の 2バイトなのではないかと予想してみます。

引用:
いえ。Shift_JISではなく、特に明記していない限り、一貫して日本語版Windows上で使う、.NET FrameworkのChar構造体で表される文字です。


おかしいなあ。それであれば、Jitta さんは 10 バイトでも 14 バイトでもなく 24バイトと数えるはずじゃないかな。やはり Jitta さん自身が SJIS あたりを前提にバイト数換算したように思うのだけど。

引用:
だって、.NET Framework上での質問ですよね?


まあ、.NET での扱いということではありますが、質問からの流れをみると、SJIS 固定長のデータを読み込んで扱いたいという気がしないでもないのです。さらに言うと、SJIS 固定長で出力(SJIS換算でバイト単位切捨て)したいという要件も場合によってはあるので、「読み取り時にバイト単位で読む」という解決方法だけでなく、String になってしまったあとの状態で、SJIS換算で扱う方法がいろいろと紹介されるのは良いことだと思います。

もちろん、適当に省略せずに、取り扱いたいエンコーディングを明示するべきという点には大いに同意します。
未記入
ぬし
会議室デビュー日: 2004/09/17
投稿数: 667
投稿日時: 2005-04-21 09:06
引用:
おかしいなあ。それであれば、Jitta さんは 10 バイトでも 14 バイトでもなく 24バイトと数えるはずじゃないかな。やはり Jitta さん自身が SJIS あたりを前提にバイト数換算したように思うのだけど。


すいません。勘違いしてました。Jitta さんが書き間違えたと言っていたのは、かぎ括弧のくくり範囲だったのですね。e までくくったら、たとえ SJIS換算でも 10バイトにも 14バイトにもならないですものね。

[ メッセージ編集済み 編集者: 未記入 編集日時 2005-04-21 09:07 ]
るぱん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 1370
投稿日時: 2005-04-21 09:24
るぱんです。

累積で考えればいいんですよね?

一文字切り出してUpperCaseなりLowerCaseなりかけて、
Asc()が変化するかしないかっていうのと、文字コード○○番〜○○番は強制的に
1バイトってんじゃだめですか?
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-04-23 21:55
すっかり遅くなってしまった。
引用:

すいません。勘違いしてました。


いえ、私も"本当のところを確かめずに"書いていました。


引用:

もちろん、適当に省略せずに、取り扱いたいエンコーディングを明示するべきという点には大いに同意します。


これで、今回は勘弁してください(^o^;
__________

あびさん>
 .NET FrameworkのChar構造体で表現される文字については、どんな文字だろうが1文字2バイトです。Stringクラスと書かないのは、それだと変わる可能性があるからですが、2バイト未満にはなりません。
 ですから、.NET Frameworkの文字列を扱う場合に、1バイト、2バイトという切り分けは、適切ではありません。
 Stringクラスでは、1文字のバイト数が不定なため、バイト単位で扱うことはできません。その為に、バイト単位で操作する関数は提供されません。何バイトで表される文字であっても、1文字は1文字ですから、文字数単位で扱えば、必ず一致します。
 バイト単位で文字を扱いたい場合は、バイト数と文字数の関係が明らかになるようにして = 何らかの文字コードにエンコードして、Byte構造体の配列にしてから、扱います。

 ここで話題にされているのがShift_JISであろうという見当は付きますが、取得元が何か書いていませんから、おそらく取得元によって解決方法が変わってきます。

Shift_JISで書かれたファイルの場合:
 エンコードする前にバイト操作して、その後に、VB.NETで扱えるようにエンコードする。

Shift_JISで定義されたデータベースの場合:
 可能なら、使用する文字コードをUTF-16に変更し、対象のカラムの宣言をNCHARにする。そうすればVB.NETでの扱いと等しくなる。
 可能でないなら、フィールドをくっつけて取得するのではなく、別々に取得する。
 それも可能でないなら、Shift_JISにエンコードし、Byte配列で操作する。


 [2005-04-20 23:31]に書いたように、Stringクラスに持ってきている以上どこかでエンコードしているはずですから、それ以前のところで切り分ければ、文字数とバイト数が云々、という問題ではなくなりますよね?
あび
ベテラン
会議室デビュー日: 2004/07/29
投稿数: 59
投稿日時: 2005-04-25 08:20
Jittaさん、他、皆様、御意見ありがとうございました。
何事も、上っ面だけの理解では、正しい解決は無いと、痛感しました。
精進します。

スキルアップ/キャリアアップ(JOB@IT)