◀ANSI版開発トップへ
  • 761 Re6: stricmp
    • 762 Re7: stricmp
      • 763 Re8: stricmp
        • 764 stricmpはlocaleの問題だった
  • [761] Re6: stricmp あああ 2001年10月11日 15:53

    サクラエディタBBSから移って来ました。

    ▼げんたさん
    >該当部分を切り出して独立させると日本語でもちゃんと動きます.

    該当部分はどこでしょうか。

    >TD32がデバッグ情報を読み込んでくれません

    http://user3.allnet.ne.jp/tadnakam/bcc32/td32.htm
    が詳しいです。
    • [762] Re7: stricmp げんた 2001年10月11日 16:21

      ▼ あああさん
      > 該当部分はどこでしょうか。
      CShareData::IsPathOpened()の中で使われているstricmpです。
      stricmpをtoupperを使った比較ループに置き換えると日本語部分で0を返すのがわかります。

      ただ、main関数にtoupperを使った固定文字列の比較ループのみを含んだプログラムを作ると日本語があっても正しく動作します。

      > >TD32がデバッグ情報を読み込んでくれません
      > http://user3.allnet.ne.jp/tadnakam/bcc32/td32.htm
      -yオプションがついていなかったのが原因のようです。あとで再コンパイルして試してみます。
      • [763] Re8: stricmp あああ 2001年10月11日 18:07

        ▼ げんたさん
        > stricmpをtoupperを使った比較ループに置き換えると日本語部分で0を返すのがわかります。

        下線付きの _toupper を試しましたか?

        > ただ、main関数にtoupperを使った固定文字列の比較ループのみを含んだプログラムを作ると日本語があっても正しく動作します。

        普通のexeは libc.libをつなげています。sakura_core はDLLですから、MSVCRT.LIB を取り込むのでしょう。

        LIBC.LIB シングルスレッド スタティック ライブラリ、リテール版
        LIBCMT.LIB マルチスレッド スタティック ライブラリ、リテール版
        MSVCRT.LIB MSVCRTx0.DLL 用インポート ライブラリ、リテール版
        MSVCRTx0.DLL マルチスレッド DLL ライブラリ、リテール版
        • [764] stricmpはlocaleの問題だった げんた 2001年10月11日 19:09

          ようやくTurbo Debuggerが動いたのでtraceしてみました.

          toupperの内部ではWin32 APIのLCMapStringを使っており,これが0x80以上のバイトに対して0を返しているみたいです.

          ソース(BCCには付いてない.C++ Builder付属のやつね)の該当部分を見ると,localeがCのときは内部のテーブルを使ってくれるようです.

          localeで検索するとCMemoryの中で setlocale( LC_ALL, "Japanese" ); をやっていますから,ファイルを開くときのコード判定部分を通ることでlocaleが変わってしまい,起動直後に判定する初回とファイル読み込み後に判定するDrag & dropでは動作が異なっていたというのが種明かしでしょう.

          とりあえず,ファイル名判定のstricmpの前にsetlocale ( LC_ALL, "C" ); を入れたら直りました.

          >sakura_core はDLLですから、MSVCRT.LIB を取り込むのでしょう。
          これはMS VCの話.今はBCCを使っているので違います.当然実装もMSとは異なっているでしょう.