- PR -

日本語入り文字列の位置

投稿者投稿内容
TomScissors
ベテラン
会議室デビュー日: 2003/06/05
投稿数: 79
投稿日時: 2005-04-20 10:06
>Jittaさん
=:全角スペースとする
-:半角スペースとする
「あいうえお」の10バイト5文字分が必ず全角文字。
1234567890あいうえおabcde
1234567890あいう----abcde
「abcde」を取得する場合、substringは上と下で変わる。
1234567890あいう==abcde
こういう方式にしておけば、substringは常に一定。

まぁこういう事でしょう。

>あびさん
日本語のところに半角文字が入る事はないのでしょうか?
半角カナとか数字とか。

#補足
日本語以外の所に半角スペースが2つあったりしても大丈夫?

[ メッセージ編集済み 編集者: TomScissors 編集日時 2005-04-20 10:09 ]
Beatle
ぬし
会議室デビュー日: 2003/06/09
投稿数: 394
投稿日時: 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等で切り出せば良いのでは?
あび
ベテラン
会議室デビュー日: 2004/07/29
投稿数: 59
投稿日時: 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関数は無いのです。。。。


NAL-6295
ぬし
会議室デビュー日: 2003/01/26
投稿数: 966
お住まい・勤務地: 東京
投稿日時: 2005-04-20 11:16
補足ですが・・・

引用:

あびさんの書き込み (2005-04-20 10:28) より:
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)




ここの部分

引用:

Return SJIS.GetString(RecB, Pos, NByte)



だけにできますよ。
_________________
「伝える」とは「人に云う」と書く。
http://d.hatena.ne.jp/NAL-6295/
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-04-20 19:00
引用:

しかし、10バイトの中に、数未定の半角文字(今回の場合、スペース)が混ざっている場合、文字数の取得が正しく出来ないということです。


引用:

=:全角スペースとする
-:半角スペースとする
「あいうえお」の10バイト5文字分が必ず全角文字。
1234567890あいうえおabcde
1234567890あいう----abcde
「abcde」を取得する場合、substringは上と下で変わる。
1234567890あいう==abcde
こういう方式にしておけば、substringは常に一定。


 日本語環境の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での話でもないのかもしれませんけど

_________________
未記入
ぬし
会議室デビュー日: 2004/09/17
投稿数: 667
投稿日時: 2005-04-20 19:45
引用:
日本語環境のWindowsで動作する.NET FrameworkアセンブリのStringクラスで表される文字列を使う限り、そんなことはありません。


もうちょっと良く 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 だとどうだろうか。試したことないので。
# いや、そもそもバイト列にした状態で切り出せばいいような気もする。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-04-20 20:55
引用:

未記入さんの書き込み (2005-04-20 19:45) より:
引用:
日本語環境のWindowsで動作する.NET FrameworkアセンブリのStringクラスで表される文字列を使う限り、そんなことはありません。


もうちょっと良く TomScissors さんの書き込みを読みましょう。TomScissors さんの書いている内容は間違っていないです。

ちょっと、子供を抱えてなので、打ち間違い失礼、と先に謝っておく

いえ、
「あいうえお」の10バイト5文字分が必ず全角文字。
このへん。「あいう----abcde」これは10バイトじゃないです。14バイト
固定長が、unicodeを元にした固定長なら、10バイトは5文字で固定
半角や全角はない、っちゅうこと
日本語windowsで扱える範囲なら
アラビア語や中国、韓国まではいると、1文字が3バイトや4バイトになったりするのかな?

とりあえず、日本で流通しているsjis, jis, euc_jpで、同じ文字列でもバイト数は違う

文字コードの前提なしにそういう話をするのはどうか、と。
環境も書いてないし

sjisありきなかきかたもどうかと

[ メッセージ編集済み 編集者: Jitta 編集日時 2005-04-20 21:08 ]
未記入
ぬし
会議室デビュー日: 2004/09/17
投稿数: 667
投稿日時: 2005-04-20 22:19
引用:
「あいう----abcde」これは10バイトじゃないです。14バイト


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

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



それとe までだとしても、14バイトと数える理由が分かりません。なんで 14バイトなんですか? 答えは不明じゃなかったでしたっけ? エンコーディングが示されていないので。JIS で制御コードが入ると 14バイト超えますよね?

引用:
とりあえず、日本で流通しているsjis, jis, euc_jpで、同じ文字列でもバイト数は違う文字コードの前提なしにそういう話をするのはどうか、と。環境も書いてないし(中略)sjisありきなかきかたもどうかと


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

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


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

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