- - PR -
日本語入り文字列の位置
投稿者 | 投稿内容 | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-04-20 10:06
>Jittaさん
=:全角スペースとする -:半角スペースとする 「あいうえお」の10バイト5文字分が必ず全角文字。 1234567890あいうえおabcde 1234567890あいう----abcde 「abcde」を取得する場合、substringは上と下で変わる。 1234567890あいう==abcde こういう方式にしておけば、substringは常に一定。 まぁこういう事でしょう。 >あびさん 日本語のところに半角文字が入る事はないのでしょうか? 半角カナとか数字とか。 #補足 日本語以外の所に半角スペースが2つあったりしても大丈夫? [ メッセージ編集済み 編集者: TomScissors 編集日時 2005-04-20 10:09 ] | ||||||||||||||||
|
投稿日時: 2005-04-20 10:24
VB.NETってよく知らないのですが、SubStringBなりMidBのようなもの
無いのでしょうか?(バイト位置で文字列切り出し) あるのであれば、全角半角が混じっていようと1行単位で変数に格納 すれば内部はすべて2ByteのUniCodeになってませんでしたっけ? あaい bうc ⇒ あ(2)a(2)い(2) (2) (2) (2)b(2)う(2)c(2) ということは、上記であ〜bの直前までを切り出すのであれば、 Sjis変換しないで1byte目から12Byte目までをMidB等で切り出せば良いのでは? | ||||||||||||||||
|
投稿日時: 2005-04-20 10:28
教えていただいたスレッドの方法で実装しました。
そこでも指摘されていましたが、指定するデータの開始位置は、全角文字を切ることが無いのが前提です。 Private Function GetString( byVal Rec As String,byVal Pos As Integer,byVal NByte As Integer ) As String ' Rec:1行のデータ ' Pos:取得するデータの開始カラム(0〜 ' NByte:取得するデータのバイト数 ' Dim SJIS As System.Text.Encoding = System.Text.Encoding.GetEncoding("Shift-Jis") Dim RecB As Byte()=SJIS.GetBytes(Rec) Dim Dat(NByte-1) As Byte For i As Integer=Pos To Pos+NByte-1 Dat(i-Pos)=RecB(i) Next Return SJIS.GetString(Dat) ちなみに、.Netには、MidB関数は無いのです。。。。 | ||||||||||||||||
|
投稿日時: 2005-04-20 11:16
補足ですが・・・
ここの部分
だけにできますよ。 _________________ 「伝える」とは「人に云う」と書く。 http://d.hatena.ne.jp/NAL-6295/ | ||||||||||||||||
|
投稿日時: 2005-04-20 19:00
日本語環境のWindowsで動作する.NET FrameworkアセンブリのStringクラスで表される文字列を使う限り、そんなことはありません。10バイトなら、必ず5文字です。それ以上でもそれ以下でもありません。 問題:文字列"アイウエオAIUEO"は、何バイトでしょう。その理由も述べなさい。 ここで、文字列はダブルクォーテーションで囲み、引用符は文字列に含まないものとします。 _____ 答え:不明。前提条件が少ないため。 EUC_JPコードだと15バイト Shift_JISコードだと10バイト JISコードで、KI, KOがそれぞれ1バイト、余分なKI, KOがなければ12バイト(だっけ?) .NET FrameworkのStringクラスでは20バイト 文字列を"バイト"で扱う危険性を認識して頂けるでしょうか? これまでの投稿で、どこにも文字コードの指定はありませんから。 # まぁ、開発環境の説明もありませんから、 # .NET Frameworkでの話でもないのかもしれませんけど _________________ | ||||||||||||||||
|
投稿日時: 2005-04-20 19:45
もうちょっと良く TomScissors さんの書き込みを読みましょう。TomScissors さんの書いている内容は間違っていないです。日本語項目にはいわゆる全角文字だけを使いましょう、そうすれば String で文字単位に切り出す場合でもデータの内容によって位置が変わることはないです、と言っているだけ。そのために日本語項目のパディングを半角スペースではなく全角スペースにする、という話。 TomScissors さんは、日本語項目に半角英数がデータとして入ってくるとズレることが分かっているから、その点についても質問者に確認を行っていますね。まあ、対比している旧システムが VB6.0 のようなので、日本語項目に半角英数が入ってくる可能性は結構高そうなので、日本語項目はすべていわゆる全角文字だけで構成されているという前提を持たせるのは難しいとは思いますが…。 -- MidB がないんだったら、(SJIS相当で)全角1文字を4バイト、半角1文字を2バイトにしてしまえば Substring があたかも MidB として機能するんじゃないかなあ。つまりこんな 感じ↓ String "あいうえお123" → SJIS でバイト列に変換する(13バイトになる) → そのバイト列を ISO-8859-1 とみなして String を作成する(13文字=26バイトになる) → Substring を使う。引数は文字単位だけど、SJIS換算でバイト単位と合致する。 # Java だとうまくいくんだけど .NET だとどうだろうか。試したことないので。 # いや、そもそもバイト列にした状態で切り出せばいいような気もする。 | ||||||||||||||||
|
投稿日時: 2005-04-20 20:55
いえ、 「あいうえお」の10バイト5文字分が必ず全角文字。 このへん。「あいう----abcde」これは10バイトじゃないです。14バイト 固定長が、unicodeを元にした固定長なら、10バイトは5文字で固定 半角や全角はない、っちゅうこと 日本語windowsで扱える範囲なら アラビア語や中国、韓国まではいると、1文字が3バイトや4バイトになったりするのかな? とりあえず、日本で流通しているsjis, jis, euc_jpで、同じ文字列でもバイト数は違う 文字コードの前提なしにそういう話をするのはどうか、と。 環境も書いてないし sjisありきなかきかたもどうかと [ メッセージ編集済み 編集者: Jitta 編集日時 2005-04-20 21:08 ] | ||||||||||||||||
|
投稿日時: 2005-04-20 22:19
何を言ってるのかまったく分からないです・・・。TomScissors さんが括弧で括ったのは あ 〜 お までで、それを 10バイトと言っているように思います↓
それとあ 〜 e までだとしても、14バイトと数える理由が分かりません。なんで 14バイトなんですか? 答えは不明じゃなかったでしたっけ? エンコーディングが示されていないので。JIS で制御コードが入ると 14バイト超えますよね?
でも、Jitta さん自身もなんらかの前提(おそらくSJIS)のもとに、14バイトという話をしているわけで。それに VB6.0 の話が出ているところを見ると、バイト数換算については SJIS 前提で話を進めて(今回の流れでは)問題ないように思います。
いや、いわゆる半角、いわゆる全角は Unicode でも存在しますね。どちらも 2バイトであらわされる(UTF-16 の場合)というだけの話であって。 |