HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2023
1216
ゆっくりXPhsp3utfをインクルードしなくてもUnicodeが使える?2解決


ゆっくりXP

リンク

2023/12/16(Sat) 21:03:49|NO.100864

Windowsのシステムロケールを弄ってたら、hsp3utfをインクルードしなくてもUnicode文字を表示できたので報告します。
地域の設定で「ベータ: ワールドワイド言語サポートで Unicode UTF-8 を使用(U)」にチェックが入っていると、Unicode文字が表示できるみたいですが、どういう処理で表示させているのでしょうか?
Unicode対応のエディタでUTF-8で記述されたプログラムを実行すると、hsp3utfをインクルードしていないのにも関わらずなぜか表示できます。
Windows APIのIsWindowUnicode関数の方でも、0(対応していない)と表示されます。

#include "user32.as" font "meiryo",16//フォントを変えないと文字化けする mes "HSP3🔺◢😀💯ⓗⓢⓟ♠♡♣♤♪" if IsWindowUnicode(hwnd):mes "Unicode対応":else:mes "Unicode非対応"



この記事に返信する


TOMATO

リンク

2023/12/16(Sat) 22:46:54|NO.100866

>Unicode対応のエディタでUTF-8で記述されたプログラムを実行すると、hsp3utfをインクルードしていないのにも関わらずなぜか表示できます。
WindowsのAPIには2種類の関数があるというのはご存知でしょうか?
末尾が"A"と"W"の関数です。
具体的に例を出すと"MessageBoxA"と"MessageBoxW"とかですね。

関数名の末尾が"A"の場合は"Ansi"、"W"の場合は"Unicode"の文字コードを指します。
(※"W"はWide文字の頭文字)

で、"Ansi"はWindowsの日本語環境においては標準では"Shift_JIS"(CP932)として取り扱います。
また、"Unicode"はすべての言語において"UTF-16"として取り扱います。
Windowsにおいて"Unicode"という単語が"単独で登場"する場合は、"UTF-16"を指します。

「ベータ: ワールドワイド言語サポートで Unicode UTF-8 を使用(U)」を有効にした場合、
"A"のAPIが"Shift_JIS"から"UTF-8"で取り扱うように変更されます。

HSP内部のお話をしますと、HSP標準ランタイムは"A"の方のAPIを使用しており、
hsp3utfランタイムは"W"の方のAPIを呼び出しています。
え?hsp3utfは"UTF-8"じゃないの?と思いますが、
WindowsのAPIを呼び出す際に都度UTF-8⇔16変換が内部で呼び出されています。

よって、「ベータ: ワールドワイド言語サポートで Unicode UTF-8 を使用(U)」を有効にすると、
標準ランタイムでも"UTF-8"が取り扱えるように"一見見えます"が、問題があります。
標準ランタイムのShift_JIS系の判定処理が残っているため、
UTF-8文字列を流してしまうと正しく動作しないケースがあります。
mes などの表示するだけなら問題ないと思いますが、
文字列操作系の命令や関数を実行するとShift_JISが来ることを想定している処理に
UTF-8のデータが流れてしまうため、意図しない不具合が発生するはずです。

>Windows APIのIsWindowUnicode関数の方でも、0(対応していない)と表示されます。
"W"版のAPIを呼び出してウィンドウを作っていないと、未対応になるんじゃないかと。



TOMATO

リンク

2023/12/16(Sat) 22:59:18|NO.100867

なお注意喚起で書いておきますが、この機能は結構危険です。

「ベータ: ワールドワイド言語サポートで Unicode UTF-8 を使用(U)」の設定は、すべてのアプリケーションに対して実行されるため、HSPの標準ランタイムのような"A"系のAPIを呼び出しているアプリケーションに多大な影響を与えます。

古いアプリケーションは"A"系のAPIでShift_JISを取り扱うことを前提にしているものもあり、バグり散らかします。
表示がバグるだけならまだいいですが、バグった文字列でレジストリやファイルを書き込んでしまった場合、設定を戻した場合でもアプリが正しく起動しなくなる危険性があります。

https://qiita.com/obaba/items/c88c6ef833cac23bb01e
https://twitter.com/kfujieda/status/1198193857873080321
https://twitter.com/kfujieda/status/1259677415590162432
https://twitter.com/h_okumura/status/1136429607484239872
https://twitter.com/Kmesuta/status/1627857579329331202
https://twitter.com/aotokie/status/1493838790598995969

実はマニフェストに、当該プロセスのみUTF-8化するオプションがあります。
しかし、GDIには対応しておらず、HSPのmes命令などは有効ではないでしょうね。
https://learn.microsoft.com/ja-jp/windows/apps/design/globalizing/use-utf8-code-page#set-a-process-code-page-to-utf-8



記事削除

記事NO.パスワード
(質問が解決したスレッドは他の利用者に活用してもらうため、削除しないようお願いします)

NO.100864への返信

マスコット

好きなマスコットを選んでください。

名前

e-mail
HOME
  1. 初めて利用する方は、HSP3掲示板の使い方をお読みください。
  2. 不要部分の多い長いスクリプトの投稿は ご遠慮ください。
  3. 書き込みは自動改行されません。適度に改行を入れてください。
  4. スクリプトは小文字の<pre>〜</pre>で囲むと見やすく表示できます。

削除用パスワード

エラー発生時、再送信すると二重送信になることがあります。
回答が得られたら、お礼書き込み時に[解決]チェックしてください。
SPAM防止のためURLから始まる文章は投稿できません。
SPAM防止のため英文字のみの本文を投稿することはできません。

ONION software Copyright 1997-2023(c) All rights reserved.