Win98とWin2000で文字化けする問題は文字コードのせい?

このQ&Aのポイント
  • Win2000で文字化けする問題の原因として、文字コードの違いが考えられます。
  • 16bit(2バイト)のUnicode文字コードと、8bit(1バイト)の文字コードでは、バイト数は同じでも表現できる文字の範囲が異なります。
  • Win2000上でデバッカを使用し、文字コードの違いによる文字化けが確認できる場合があります。
回答を見る
  • ベストアンサー

やはり文字コードのせいでしょうか?

固定長のテキストに区切り文字の","や"/"を挿入して整形する プログラムを作っていたときWin98では正常に動作していましたが、 Win2000だと文字化けしてうまくいきません。 Unicodeとの文字コードの違いかな?とも思ったのですが、16bit (2バイト)ということでバイト数は同じだと思うのですが、デバッカ で見ると目的の位置より手前でカウントを終了しているようです。 というのもWin2000上ではデバッカのローカル変数をウオッチしても 変数内の漢字も文字化けしているため確認できません。 元のテキスト "20010505文字列次の文字列1234" こうしたい "2001/05/05,文字列,次の文字列,12,34" が、こうなる "2001/05/05,文字・。・・次の文字・。、" (実際とは違います) 行儀が悪いプログラムなのですが、こんな感じです。 char kigou[7][2]={"/","/",","," ",":",":",""}; int skip[7]={4,2,22,12,2,2,2}; for(i=0;i<7;i++){ strncat(tmpbuff, pt, skip[i]); tmpptr += skip[i]; strcat(tmpbuff,kigou[i]); tmpptr += strlen(kigou[i]); pt += skip[i]; } コンパイラはBorlandC++Builder4です。 ファイルの整形だけなのでCの関数しか使っていません。 ご存知の方、回答よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • pikacchu
  • ベストアンサー率44% (11/25)
回答No.2

こんにちは。 的を得ていなくてすみません。 入力データを把握する意味で、入力データを全て16進で表示させてみては如何ですか? for(i = 0; i < 1024; i++) printf(" %02x", *(pt+i) & 0xff); Win環境でプログラムを作ったことが最近ないので、一緒に悩んでしまってごめんなさい。 (^^;

socrates
質問者

お礼

pikacchuさん。ありがとうございます。 ダンプ出力して調べてみた結果、UnicodeではなくJISでした。(ホストマシンが古いので)少し容量が増えていたのも、漢字の開始、終了に伴う0x1b,0x24,0x40などのコードでした。JISコードは他の文字と領域が重なるため漢字の開始、終了に専用のコードが挿入されるのをすっかり忘れていました。何はともあれダンプのアイデアで解決できました。でもWin98環境ではどうして動いていたんだろう・・・?

socrates
質問者

補足

ははぁ、なるほど。 ファイルから読み込んだダンプリストとストリームから読み込んだデータのダンプを比べてみれば違いがわかりそうですね。 私もCプログラムが久しぶりなので思いつきませんでした。ちょっとやってみます。でも、違いがわかってもUnicodeだった場合の変換といおうか文字列の扱いはどうしたらいいんでしょうか・・。

その他の回答 (1)

  • pikacchu
  • ベストアンサー率44% (11/25)
回答No.1

こんにちは。 初歩的なことでもうしわけないですが、"tmpbuff"は'\0'(ヌル)で初期化されていますか? ローカル変数と仮定すると起こりえるかと・・・

socrates
質問者

補足

省略したソースなのでご心配をおかけしました。 作業用の配列はすべてmemsetで初期化しております。 memset(tmpbuff,'\0',1024); fgets()で読み込んでいるのですが、どうも漢字の部分が容量が増えている気配があります。(正確には数えていませんが・・) Unicodeではストリームで読み込んだデータに何か付加する仕様になっているのでしょうか?半角数字は変化がないようです。 以上、よろしくお願いします。

関連するQ&A

  • 算術記号(+,-,/,*)を文字としてあらわして計算に使用する方法

    ビジュアルベーシック初心者です。 タイトルでは誤解をうむと思いますが、やりたいことは以下のようなことです。 kigouという変数をstringsで宣言しそこに文字として算術記号を代入する。  例 kigou = "+" このkigou変数を用いて、実際の計算をする。 例 i = 1 kigou 2 この場合、kigou変数には+が代入されているので、iの値は3になる。 このように、kigouに入れる算術記号を任意にかえ、kigouという変数を用いて実際の計算をさせたいのですが、正しい記述方法などがわかりません。方法はありますか?

  • VBAでテキストファイルの改行を無視する方法

    VBAでテキストファイルにある文字列を配列の変数に格納したいのですが、改行が含まれているとそこから2バイトずつずれてしまいます。 1行毎に読もうとしても1行の文字列が6000バイトぐらいあるので変数に格納しきれません。 読み込むテキストファイルは _________0_________1_________2・・・・________10 _______100________51 のようになっており、10バイトずつ変数に格納していきたいです(スペースも格納する必要あり) 以下のように作ったのですが、改行のあるところからずれてしまいます。 Sub ファイル読み込み() Dim buf(30000000) As String Dim i As Long i = 0 With CreateObject("Scripting.FileSystemObject") With .OpenTextFile("C:\test.text", 1) Do While .AtEndOfStream <> True buf(i) = .read(10) Loop End With End With End Sub 「次の文字列が改行コードである」ということが分かれば.skipで飛ばせるのですが、その判定式が探しても見つかりません。 どなたかご教授よろしくお願いします。

  • 文字が含まれているか調べる

    変数iにある文字(又は文字列)が含まれているかどうか調べたいのですが、どうすればいいのでしょうか。 よろしくお願いします。

  • このようなテキストの抽出は・・・。

    次のようなテキストを抽出するにばどうすればいいのでしょうか。 次の条件の文字列変数theVarにおいて、*の部分を抽出したいです。 <i>*</i> <i>と</i>はないかもしれません。 「*」はワイルドカート、「<」と「>」はメタキャラではなくただの文字。 よろしくお願いします。

  • CString型の文字列連結について

    質問させて頂きます。 開発環境はVC++.netです。 CString型の文字列連結について教えて頂きたく。 CString Test[_MAX_FNAME+1]; という変数にがあるとします。 Test変数のデータは Test[0]には"2" Test[1]には"1" が格納されてるとします。 Test変数のデータをCString Text1という変数に 以下のようなソースで文字列連結処理を行ったのですが、だめでした。 何がいけないのでしょうか? for(int i = 0; i <= 2; i++) { Text1 += Test[i]; } 実行結果は Text1には"2"が格納されたままでした。 実際はText1には、"2""1"となってほしい。 分かりにくい説明とは思いますが、 回答、ヒントなどを頂けますでしょうか 宜しくお願い致します。 それと、もしよかったら、Text1の格納データは "2","1"としたいので、カンマ区切りのやりかたなども ヒントを頂けたら幸いです。 以上です。 宜しくお願い致します。

  • 文字コードから文字列への変換

    よくわからないタイトルですみません(汗。 標準入力からデータを渡すと、I/Oをしてくれるというモジュールを書いているのですが、当初、テキストのみの設計のつもりだったのが、バイナリを扱うはめになってしまいました。 それで、バイナリはstdinから読めなさそうだったので、0xXYZという文字列にしてからstdin経由で渡そうと思ったのです。 今回の質問は、その文字列で書かれた16進コードを文字に直す方法なのです。 つまり、char buf[80] = "0x414243"という文字列を渡した場合、char buf2[80] = "ABC" という文字列を得たいのです。(0x41="A") 変な希望ですが、何通りか試したのですが、根っからのテキスト処理大好きPerl人間なので、Cの知識の無さに挫折してしまいました。 アドバイスをよろしくお願いいたします。

  • 変数を文字列として扱う方法

    VB初心者なのですが、 変数を、その変数のまま文字列で扱う方法がないかと悩んでいます。具体的に言うと、 たとえば、 Dim Bef(i,j) As String と宣言しておいて、 Bef(1,1)に、SCATTERBRAiN11 Bef(1,2)に、SCATTERBRAiN12 Bef(1,3)に、SCATTERBRAiN13 …… Bef(i,j)に、SCATTERBRAiNij という「文字列」を入れたいのです。 (最後の2文字i,jが、そのときの変数i,jの値。) これをFor構文を使って、 Bef(i,j)="SCATTERBRAiN" + i + j と書いたら、エラーになってしまいました。 iやjを、その変数に入っている数字の文字列として扱うには、どうすればいいのでしょうか。 よろしくお願いします。

  • 括弧が含まれる文字列の括弧の中身の文字列(VB6)

    括弧()の中身の文字列をそれぞれ配列の文字列変数に設定したいと考えているのですが、Replaceを使えばいいのでしょうか? また、Replaceは置き換える文字の検索の開始場所は設定できると思うのですが、置き換える文字の検索の終了の場所は設定できるのでしょうか? 例えば、(asdf)as(asdfe)as(sf)という文字列のasdf,asdfe,sfをそれぞれ配列を使って文字列変数として表したいのです。 nyuuryoku = Text1.Text For i = 1 To Len(nyuuryoku) If Mid(nyuuryoku, i, 1) = "(" Then k = k + "と" + CStr(i) j = j + 1 ElseIf Mid(nyuuryoku, i, 1) = ")" Then m = m + "と" + CStr(i) l = l + 1 End If Next i Text17.Text = "( は" + CStr(j) + "個" + k + "番目、 " + ") は" + CStr(l) + "個" + m + "番目" For i = 1 To Len(nyuuryoku) If Mid(nyuuryoku, i, 1) = "[" Then kk = kk + "と" + CStr(i) jj = jj + 1 ElseIf Mid(nyuuryoku, i, 1) = "]" Then mm = mm + "と" + CStr(i) ll = ll + 1 End If Next i Text2.Text = "[ は" + CStr(jj) + "個" + kk + "番目、" + "] は" + CStr(ll) + "個" + mm + "番目" Dim kakkohajime(50) As Long Dim kakkoowari(50) As Long Dim kakkonakami(50) As String For i = 1 To CStr(j) kakkohajime(0) = 1 kakkohajime(i) = InStr(kakkohajime(i - 1), nyuuryoku, "(") Next For i = 1 To CStr(j) kakkoowari(0) = 1 kakkoowari(i) = InStr(kakkohajime(CStr(j) + 1 - i), nyuuryoku, ")") Next このあとにkakkohajime(i)の場所からkakkoowari(i)の場所までの文字列をそれぞれkakkonakami(i)の配列の文字列にいれたいのです。 最後に、kakkonakami(i)をtextに表示したいと思っています。

  • 改行コードについて

    phpで開発をしています。 テキストファイルに文字列を出力する際に、改行コードを扱う以下のような場合について、 ①$str='ab\ncd'; ②$str="ab\ncd"; ①の変数の内容を出力すると\nがそのまま出力されます。 ②の変数の内容を出力すると改行されて出力されます。 質問ですが、この二つの違いについては、 ①のときは\nという文字として出力された。 ②のときは改行コードとして出力された。 (バイトコードで見ると、二つのコードは違っている?) という認識で良いのでしょうか。 ご教示いただけますと幸いです。

    • ベストアンサー
    • PHP
  • 文字列型の一般的な変数名は?

    おはようございます。 サンプルコードで 数値型の変数名は Dim i As Long のようにiをよく見かけます。 ただ、私が勉強不足のため 文字列型の変数名の一般的な文字に何が使われているのかわかりません。 (str?moji?など?) サンプルコードを書くときに使用する 文字列型の変数名を教えてください!

専門家に質問してみよう