プログラミングのメモ帳(C/C++/HSP)

日々のプログラミングで気づいた点や小技集を紹介します。(Windows 10/XP/Vista、VC2017、HSP)

[HSP]UTF-16デコードについて

2017年09月20日 12時28分00秒 | HSP講座

スクリプト言語の HSP については、公式ホームページの「HSPTV!」をどうぞ。(戻る)


ここには、HSPの公式掲示板で質問してきたハンドル名「jsAster」さんの質問「HSP3Dish 「NDKのビルドに失敗しました」」に回答したソースを紹介します。
この方は、最初「hsp3dishでUTF-16の変換」で質問してます。
質問内容は、タイトル通りで「HSP3Dish」でユニコードの「UTF-16」を自力で日本語に変換したいそうです。
まずは、質問者さんが提示したスクリプトを紹介します。

#include "hsp3dish.as"
#module
    #defcfunc unc str a
    lgh=strlen(a)
    ax=a
    aa=""
    b=""
    c=""
    sk=0
    repeat 32
        aa=strmid(ax,sk,6)
        ;if aa
        if strmid(aa,0,1)="\\"{
        c="□"
        ;---------------------
        if aa="\\u3041":c="ぁ"
        if aa="\\u3042":c="あ"
        if aa="\\u3043":c="ぃ"
        if aa="\\u3044":c="い"
        if aa="\\u3045":c="ぅ"
        if aa="\\u3046":c="う"
        if aa="\\u3047":c="ぇ"
        if aa="\\u3048":c="え"
        if aa="\\u3049":c="ぉ"
        if aa="\\u304a":c="お"
        if aa="\\u304b":c="か"
        if aa="\\u304c":c="が"
        if aa="\\u304d":c="き"
        if aa="\\u304e":c="ぎ"
        if aa="\\u304f":c="く"
        if aa="\\u3050":c="ぐ"
        if aa="\\u3051":c="け"
        if aa="\\u3052":c="げ"
        if aa="\\u3053":c="こ"
        if aa="\\u3054":c="ご"
        if aa="\\u3055":c="さ"
        if aa="\\u3056":c="ざ"
        if aa="\\u3057":c="し"
        if aa="\\u3058":c="じ"
        if aa="\\u3059":c="す"
        if aa="\\u305a":c="ず"
        if aa="\\u305b":c="せ"
        if aa="\\u305c":c="ぜ"
        if aa="\\u305d":c="そ"
        if aa="\\u305e":c="ぞ"
        if aa="\\u305f":c="た"
        if aa="\\u3060":c="だ"
        if aa="\\u3061":c="ち"
        if aa="\\u3062":c="ぢ"
        if aa="\\u3063":c="っ"
        if aa="\\u3064":c="つ"
        if aa="\\u3065":c="づ"
        if aa="\\u3066":c="て"
        if aa="\\u3067":c="で"
        if aa="\\u3068":c="と"
        if aa="\\u3069":c="ど"
        if aa="\\u306a":c="な"
        if aa="\\u306b":c="に"
        if aa="\\u306c":c="ぬ"
        if aa="\\u306d":c="ね"
        if aa="\\u306e":c="の"
        if aa="\\u306f":c="は"
        if aa="\\u3070":c="ば"
        if aa="\\u3071":c="ぱ"
        if aa="\\u3072":c="ひ"
        if aa="\\u3073":c="び"
        if aa="\\u3074":c="ぴ"
        if aa="\\u3075":c="ふ"
        if aa="\\u3076":c="ぶ"
        if aa="\\u3077":c="ぷ"
        if aa="\\u3078":c="へ"
        if aa="\\u3079":c="べ"
        if aa="\\u307a":c="ぺ"
        if aa="\\u307b":c="ほ"
        if aa="\\u307c":c="ぼ"
        if aa="\\u307d":c="ぽ"
        if aa="\\u307e":c="ま"
        if aa="\\u307f":c="み"
        if aa="\\u3080":c="む"
        if aa="\\u3081":c="め"
        if aa="\\u3082":c="も"
        if aa="\\u3083":c="ゃ"
        if aa="\\u3084":c="や"
        if aa="\\u3085":c="ゅ"
        if aa="\\u3086":c="ゆ"
        if aa="\\u3087":c="ょ"
        if aa="\\u3088":c="よ"
        if aa="\\u3089":c="ら"
        if aa="\\u308a":c="り"
        if aa="\\u308b":c="る"
        if aa="\\u308c":c="れ"
        if aa="\\u308d":c="ろ"
        if aa="\\u308e":c="ゎ"
        if aa="\\u308f":c="わ"
        if aa="\\u3090":c="ゐ"
        if aa="\\u3091":c="ゑ"
        if aa="\\u3092":c="を"
        if aa="\\u3093":c="ん"
        ;---------------------
        if aa="\\u30fc":c="ー"
        if aa="\\u3001":c="、"
        if aa="\\u3002":c="。"
        if aa="\\uff01":c="!"
        if aa="\\uff1f":c="?"
        if aa="\\u330c":c="「"
        if aa="\\u330e":c="」"
        if aa="\\u3010":c="【"
        if aa="\\u3011":c="】"
        ;---------------------
        if aa="\\u30a1":c="ァ"
        if aa="\\u30a2":c="ア"
        if aa="\\u30a3":c="ィ"
        if aa="\\u30a4":c="イ"
        if aa="\\u30a5":c="ゥ"
        if aa="\\u30a6":c="ウ"
        if aa="\\u30a7":c="ェ"
        if aa="\\u30a8":c="エ"
        if aa="\\u30a9":c="ォ"
        if aa="\\u30aa":c="オ"
        if aa="\\u30ab":c="カ"
        if aa="\\u30ac":c="ガ"
        if aa="\\u30ad":c="キ"
        if aa="\\u30ae":c="ギ"
        if aa="\\u30af":c="ク"
        if aa="\\u30b0":c="グ"
        if aa="\\u30b1":c="ケ"
        if aa="\\u30b2":c="ゲ"
        if aa="\\u30b3":c="コ"
        if aa="\\u30b4":c="ゴ"
        if aa="\\u30b5":c="サ"
        if aa="\\u30b6":c="ザ"
        if aa="\\u30b7":c="シ"
        if aa="\\u30b8":c="ジ"
        if aa="\\u30b9":c="ス"
        if aa="\\u30ba":c="ズ"
        if aa="\\u30bb":c="セ"
        if aa="\\u30bc":c="ゼ"
        if aa="\\u30bd":c="ソ"
        if aa="\\u30be":c="ゾ"
        if aa="\\u30bf":c="タ"
        if aa="\\u30c0":c="ダ"
        if aa="\\u30c1":c="チ"
        if aa="\\u30c2":c="ヂ"
        if aa="\\u30c3":c="ッ"
        if aa="\\u30c4":c="ツ"
        if aa="\\u30c5":c="ヅ"
        if aa="\\u30c6":c="テ"
        if aa="\\u30c7":c="デ"
        if aa="\\u30c8":c="ト"
        if aa="\\u30c9":c="ド"
        if aa="\\u30ca":c="ナ"
        if aa="\\u30cb":c="ニ"
        if aa="\\u30cc":c="ヌ"
        if aa="\\u30cd":c="ネ"
        if aa="\\u30ce":c="ノ"
        if aa="\\u30cf":c="ハ"
        if aa="\\u30d0":c="バ"
        if aa="\\u30d1":c="パ"
        if aa="\\u30d2":c="ヒ"
        if aa="\\u30d3":c="ビ"
        if aa="\\u30d4":c="ピ"
        if aa="\\u30d5":c="フ"
        if aa="\\u30d6":c="ブ"
        if aa="\\u30d7":c="プ"
        if aa="\\u30d8":c="ヘ"
        if aa="\\u30d9":c="ベ"
        if aa="\\u30da":c="ペ"
        if aa="\\u30db":c="ホ"
        if aa="\\u30dc":c="ボ"
        if aa="\\u30dd":c="ポ"
        if aa="\\u30de":c="マ"
        if aa="\\u30df":c="ミ"
        if aa="\\u30e0":c="ム"
        if aa="\\u30e1":c="メ"
        if aa="\\u30e2":c="モ"
        if aa="\\u30e3":c="ャ"
        if aa="\\u30e4":c="ヤ"
        if aa="\\u30e5":c="ュ"
        if aa="\\u30e6":c="ユ"
        if aa="\\u30e7":c="ョ"
        if aa="\\u30e8":c="ヨ"
        if aa="\\u30e9":c="ラ"
        if aa="\\u30ea":c="リ"
        if aa="\\u30eb":c="ル"
        if aa="\\u30ec":c="レ"
        if aa="\\u30ed":c="ロ"
        if aa="\\u30ee":c="ヮ"
        if aa="\\u30ef":c="ワ"
        if aa="\\u30f0":c="ヰ"
        if aa="\\u30f1":c="ヱ"
        if aa="\\u30f2":c="ヲ"
        if aa="\\u30f3":c="ン"
        if aa="\\u30f4":c="ヴ"
        if aa="\\u30f5":c="ヵ"
        if aa="\\u30f6":c="ヶ"
        ;---------------------
        sk+=6
    }else{
        sk++
        c=strmid(aa,0,1)
    }
        b=""+b+c
        await
        ;stop
    loop
    return b
    #global

上記のスクリプトを見るとユニバーサル文字列(\uXXXX)のデコードらしいです。
ユニコードの「UTF-8」とか、「UTF-16」などは知ってましたが、ユニバーサル文字列は初めて知りました。
そこでネット検索すると変換するためのサイトが多数見つかりました。

なぜ、ビルドに失敗したのか?

回答者「しまくろねこ」さんがヒントを出してくれてます。

if aa == "\\u30bd" : c = "ソ"

上記の行の "ソ" が原因みたいでNDKビルド失敗になっているようです。
原因はちょっとわかりませんでした。

下記はわかりやすいように "ソ" の行だけ残したスクリプトですが、元のスクリプトの "ソ" の行コメントアウトをNDKビルド成功になることが分かると思います。

これを読んだとき、脳裏に浮かんだのが「」記号の問題です。
昔、マイクロソフト社の「MSC」というCコンパイラを使っていた時に
漢字に対応してないために漢字の第二文字が「」記号の場合には、不具合(エラー)が出ることを思い出しました。
そこで「」と半角の「」記号を調べてみると読み通りです。

SJIS=0x835C:ソ
SJIS=0x005C:\

やはり「」の第二文字が「0x5C」=「」ですね。
そこで次のような回答を私は出してます。

> 上記の行の "ソ" が原因みたいでNDKビルド失敗になっているようです。
> 原因はちょっとわかりませんでした。
良くある原因です。

SJIS=0x835C:ソ
SJIS=0x005C:\
↑
原因は「\」記号です。

「\」記号はエスケープ文字ですよね。
漢字の第二文字が「\」記号の場合は、エスケープ文字として解釈してしまうのです。
これは漢字に対応してないからです。

つまり、「c="ソ"」は「c」「=」「"」「0x83」「\"」と解釈してます。
「\」記号のエスケープ文字で「\"」は「"」ですよね。

だからきっと「c="ソ\"」とすれば解決するかもしれないね。

まぁ、こんな感じのやり取りが続き、
自力で「UTF-16」のデコードするためのスクリプトを考えていくわけです。

目次



コメント   この記事についてブログを書く
  • Twitterでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« [HSP]ディスク使用率のサン... | トップ | [HSP]UTF-16デコードのサン... »
最新の画像もっと見る

コメントを投稿

HSP講座」カテゴリの最新記事