- - PR -
日本語入り文字列の位置
«前のページへ
1|2|3
投稿者 | 投稿内容 | ||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-04-20 23:31
はい。「あいう----」で14バイト。10バイト固定領域に「あいうえお」だとスペースがない。「あいう」の3文字だったら「あいう----」となる、という話ですよね。.NET Framework上では、10バイト分だと、「あいう----」ではなく、「あいう--」です。0x20の空白は、1バイトではなく、0x00と0x20の2バイトです。
その通り!!失敗失敗
いえ。Shift_JISではなく、特に明記していない限り、一貫して日本語版Windows上で使う、.NET FrameworkのChar構造体で表される文字です。だって、.NET Framework上での質問ですよね? それで、Shift_JISでいいのかな?とは思ったのですが、Shift_JISで書かれたファイルを読んで、それをUnicodeにエンコードし、そして「Shift_JISのバイト数とUnicodeのバイト数が一致しない」という問題なら、エンコードする前に分けてしまえばすむ問題だと思います。なので、違うと判断しました。 足りなければ埋められる、ということなので、データベースだと判断しました。それならば、ADO.NETかドライバか、どこかでUnicodeに変換され、それを意識しないで使っているのだろうと判断しました。 もっとも、それであっても、1フィールドずつ持ってきていればTrimですむはずで、それが私の一番最初だったのですが。
すみません、削ってしまいました。"どちらも2バイト"の意図です。 ただ、プロポーショナルフォントを使うと、全角、半角も、ないと思います。これは固定ピッチフォントだからちょうど半分になるわけですから。 | ||||||||||||||||||||||||||||
|
投稿日時: 2005-04-21 07:23
なので、半角スペース2つを全角スペースひとつに置換しておけば(かなり条件が限定されるけど)切り出し位置はズレなくなりますよね、という話なのでは。
Windows との相性を考えると、おそらく UTF-16LE で 0x20 と 0x00 の 2バイトなのではないかと予想してみます。
おかしいなあ。それであれば、Jitta さんは 10 バイトでも 14 バイトでもなく 24バイトと数えるはずじゃないかな。やはり Jitta さん自身が SJIS あたりを前提にバイト数換算したように思うのだけど。
まあ、.NET での扱いということではありますが、質問からの流れをみると、SJIS 固定長のデータを読み込んで扱いたいという気がしないでもないのです。さらに言うと、SJIS 固定長で出力(SJIS換算でバイト単位切捨て)したいという要件も場合によってはあるので、「読み取り時にバイト単位で読む」という解決方法だけでなく、String になってしまったあとの状態で、SJIS換算で扱う方法がいろいろと紹介されるのは良いことだと思います。 もちろん、適当に省略せずに、取り扱いたいエンコーディングを明示するべきという点には大いに同意します。 | ||||||||||||||||||||||||||||
|
投稿日時: 2005-04-21 09:06
すいません。勘違いしてました。Jitta さんが書き間違えたと言っていたのは、かぎ括弧のくくり範囲だったのですね。e までくくったら、たとえ SJIS換算でも 10バイトにも 14バイトにもならないですものね。 [ メッセージ編集済み 編集者: 未記入 編集日時 2005-04-21 09:07 ] | ||||||||||||||||||||||||||||
|
投稿日時: 2005-04-21 09:24
るぱんです。
累積で考えればいいんですよね? 一文字切り出してUpperCaseなりLowerCaseなりかけて、 Asc()が変化するかしないかっていうのと、文字コード○○番〜○○番は強制的に 1バイトってんじゃだめですか? | ||||||||||||||||||||||||||||
|
投稿日時: 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クラスに持ってきている以上どこかでエンコードしているはずですから、それ以前のところで切り分ければ、文字数とバイト数が云々、という問題ではなくなりますよね? | ||||||||||||||||||||||||||||
|
投稿日時: 2005-04-25 08:20
Jittaさん、他、皆様、御意見ありがとうございました。
何事も、上っ面だけの理解では、正しい解決は無いと、痛感しました。 精進します。 |
«前のページへ
1|2|3