◀Unicode版開発トップへ
  • 437 ASCII文字0xA0の幅
    • 439 Re:ASCII文字0xA0の幅
      • 442 Re2:ASCII文字0xA0の幅
        • 443 Re3:ASCII文字0xA0の幅
  • [437] ASCII文字0xA0の幅 kobake 2008年05月25日 06:58

    一般掲示板にて 0xA0 を半角表示にしたい、との要望がきていますが、
    これって実際、どんな幅であるべきなんでしょうか。

    (検証1)
    WindowsVista の「MS ゴシック」で
    0xA0 を GetTextExtentPoint32A にかけると、全角幅が返ってきます。
    0xA0 を MultiByteToWideChar した結果の 0xF8F0 を GetTextExtentPoint32W にかけると、全角幅が返ってきます。

    (検証2)
    WindowsVistaのメモ帳で「MS ゴシック」で
    0xA0 が含まれる文書を開くと、その文字部分は全角幅で描画されます。

    上記結果から、少なくとも WindowsVista の「MS ゴシック」では
    0xA0 は全角幅で定義されているように見えます。


    サクラエディタUNICODE版で 0xA0 が全角表示されるのは、「仕様」ってことで良いですかね?文字コードに詳しくないので、どう判断してよいか判りません。識者からのご意見をいただけると助かります。


    #リッチな策として、文字幅をユーザ定義でカスタマイズできる機能を付ける、という案もありますが、それはまた統合後にでも考えましょう。
    • [439] Re:ASCII文字0xA0の幅 ラスティブ 2008年05月25日 14:06

      ▼ kobakeさん
      UNICODEでは NO-BREAK-SPACE と定義されていて、
      U+0020 の SPACE と似ているようですので、
      半角扱いが適切ではないでしょうか。
      http://www.unicode.org/charts/PDF/U0080.pdf

      > 0xA0 を MultiByteToWideChar した結果の
      > 0xF8F0 を GetTextExtentPoint32W にかけると、
      > 全角幅が返ってきます。

      CP932の未定義文字、0xA0 を
      MB_ERR_INVALID_CHARSフラグつきのMultiByteToWideCharに
      かけると変換に失敗しますが、付けてないと
      スルーされちゃうようです。
      • [442] Re2:ASCII文字0xA0の幅 Uchi 2008年05月25日 20:21

        0xA0はSjisでは未定義になっています。
        フォントとしては「MS ゴシック」「MS 明朝」では
        u+A0は半角と定義され、u+F8F0は未定義(グリフ指定なし)(したがってデフォルト文字'・'「全角」とみなされている)となっています。
        rev1344(Commit報告 Unicode:409)の修正で、フォント設定の対応した半角、全角判定を追加していますので、
        フォントを「Courier New」に変更すれば、該当のファイルは桁ずれを起こさないように見えます。
        (フォントとしては、すべての文字が半角幅になる)
        対応とすれば、これで十分だと思いますが、いかがでしょうか?

        仕様的に変更するならば、Sjis の0xA0,0xFD,0xFE,0xFFがU+F8F0,U+F8F1,U+F8F2,U+F8F3に変換されているのを、そのままU+A0,U+FD,U+FE,U+FF に変換するという変換もありかと思います。
        (Mocaさん版サクラエディタunicode版がその仕様です)
        • [443] Re3:ASCII文字0xA0の幅 もか 2008年05月26日 00:14

          >rev1344(Commit報告 Unicode:409)の修正で、フォント設定の対応した半角、全角判定を追加していますので、
          >フォントを「Courier New」に変更すれば、該当のファイルは桁ずれを起こさないように見えます。
          charcode.cppより
          > // 外字は全角とみなす
          > if (wc>=0xE000 && wc<=0xE8FF) return false; // Private Use Area
          > //$$ 仮。もう動的に計算しちゃえ。(初回のみ)
          > return CalcHankakuByFont(wc);
          PUAの範囲はU+E000~U+F8FFです。
          コードの定義範囲が間違っていて、たまたまフォントサイズを参照できるようになっているみたいです。

          >仕様的に変更するならば、Sjis の0xA0,0xFD,0xFE,0xFFがU+F8F0,U+F8F1,U+F8F2,U+F8F3に変換されているのを、そのままU+A0,U+FD,U+FE,U+FF に変換するという変換もありかと思います。
          >(Mocaさん版サクラエディタunicode版がその仕様です)
          私が言うのもなんですが、0xA0は双方向できるのでよしとしても、0xFD,0xFE,0xFFは反則的だとおもいます。
          上書き保存したときにつぶれるんじゃないかな。
          それよりは、全角にみえたとしてもU+F8xxのほうがよいと思います。
          開いて→保存でコードも保持されるし、
          sakuraWで開いたのをメモ帳にコピペしてSJISで保存するときに値を保持したままにできます。
          これは、前kobakeさんが言っていた標準化の話です。で標準に従うべきかと。

          関係ないけどフォントをCourier Newにすると※の表示幅がおかしいです。
          単独or英字のみと「※」を表示すると豆腐になるので豆腐の幅になってるみたいです。
          たしかこれは、FontLink周りのバグか仕様だったきがします。
          試せてないのですけどPUAもそれに該当する可能性があります。

          私の意見のまとめとしては、
          FontLinkが正しく使えるのならフォントに依存するようにすればいいとおもいます。
          そうでないなら全角固定でいいのではないか。
          どうしてもというならPUAのうち「U+F8F0,U+F8F1,U+F8F2,U+F8F3」だけ半角固定がよさそう。
          というかんじになります。