DelphiXE8は#128=#$0080ではないのか?

私、Delphiは#128と#$0080はイコールだと思っていました。

でも、そうではないと思われる場面に遭遇しました。

きっかけは海外のSkRegExpユーザーさんからの「XE8上で、3.0.8と3.1.のでマッチ結果が異なる」という指摘でした。

正規表現='\b[Ĉ]([^Ĉ\d]+)'
対象文字列='Ĉ Ĉĉĉ';

コレは先頭の2文字にマッチするのが正解です。

もちろん、私のテストでもそうなります。

しかし、そのユーザーさんのテストではマッチしないというのです。

問題が再現しないって言う最悪のケースです。

コレって本当に困りますよね。

幸い、ユーザーさんが問題解決に協力すると言ってくれました。

問題箇所を絞り込むために何度もテストプログラムを送り、結果を返してもらいました。

で、問題の原因となったコードはコレでした。

if AStr^ < #128 then

Ĉ は U+0108H です。

この条件式は False になるはずです。

しかし、テストコードの結果は True になっていました。

そりゃマッチするわけないですわ!

Delphi は XE2 以降で仕様が変わったのでしょうか?

ま、そんな疑問は置いておいて。

問題解決が先です。

ならばと、次のように書き換えてテストプログラムを送って結果を返してもらいました。

if AStr^ < #$0080 then

問題は解決しました。

でも、どうなってんの? コレ?

ちなみにXE8でテストしなかった理由は、私がXEで止まっている&XE8体験版の試用期限が切れたためです。

DelphiXE8は#128=#$0080ではないのか?」への7件のフィードバック

  1. DEKO

    えっとですね、
    二桁のコントロール文字列は ANSI 扱いなんです。なので、

    if AStr^ < #128 then

    if AStr^ < AnsiChar(#128) then
    と同義になります。

    ANSI の #$80 (#128) は SHIFT_JIS には存在しないため、何ともマッチしない事になります。
    https://msdn.microsoft.com/en-us/goglobal/cc305152.aspx

    4桁のコントロール文字は常に Unicode として扱われます。
    よって、Delphi 2009 以降では原則として四桁のコントロール文字を使う事が推奨されます。
    但し、ASCII 部 ( Unicode の変換オーバーヘッドは存在します)

    問題になるのは 0x80~0xFF の “二桁の” コントロール文字です。
    これらを強制的に Unicode とみなすには、{$HIGHCHARUNICODE ON} を指定します。
    http://docwiki.embarcadero.com/RADStudio/ja/HIGHCHARUNICODE_%E6%8C%87%E4%BB%A4%EF%BC%88Delphi%EF%BC%89

    返信
    1. 小宮秀一 投稿作成者

      DEKOさん、いつもお世話になっています。

      > ANSI の #$80 (#128) は SHIFT_JIS には存在しないため、何ともマッチしない事になります。

      つまり、XE でマッチする方がおかしいと言う理解でいいんですよね。

      教えて頂いてありがとうございました。

      返信
      1. DEKO

        いえいえー♪SkRegExp はいつも便利に使わせて頂いています。

        折角なので別件を。
        少額で恐縮ですが Paypal での寄付を行いたいと思っています…しかしながら Paypal のリンクが切れているようです。恐らくですが、再度口座の確認を行わないと Paypal リンクが使えないと思われます。
        (加えて Paypal では “寄付” というアイテムがなくなっています)

        # 私のトコでは “任意の商品” という事にしています。
        # http://ht-deko.com/delphiforum/harahettaware/

        返信
        1. 小宮秀一 投稿作成者

          DEKOさん、いろいろありがとうございます。

          PayPalはいろいろ面倒なので、DEKOさんのページをヒントにアマゾンギフト券での受付に変更しました。

          この手があったか!と目から鱗でした。

          返信
            1. 小宮秀一 投稿作成者

              DEKOさん、アドバイスありがとうございます。

              skregexp.komish.comは、日英両用に対応中で、先ほどamazon.comへのリンクも掲載しました。

              返信
  2. DEKO

    あれ?文章が一部おかしいですね?

    > 但し、ASCII 部 ( Unicode の変換オーバーヘッドは存在します)

    但し、ASCII 部 (<0x80) は Unicode と互換性があるので問題になる事は少ないです。
    (ANSI -> Unicode の変換オーバーヘッドは存在します)

    ※ Unicode の U+0000~U+007F は ASCII (0x00~0x7F) と同じなので、
     ANSI ->Unicode 変換しても文字コードには依存しない。

    返信

コメントを残す

メールアドレスが公開されることはありません。