探検
文字コード総合スレ part15
1デフォルトの名無しさん
2024/08/17(土) 11:18:00.01ID:VHa7+i59 文字コードについて語り合うスレです
133デフォルトの名無しさん
2024/12/07(土) 14:01:25.11ID:8ekNK8XT >他の方法が駆逐されるわけじゃなく新たなバリエーションを増やすだけ
ほんそれ
ほんそれ
134デフォルトの名無しさん
2024/12/07(土) 14:17:40.72ID:Zwl6oBBL まずはMacを駆逐しよう
135デフォルトの名無しさん
2024/12/07(土) 16:00:13.39ID:2Ddhf3xH Mac で日本語を駆逐でいいんじゃね?
136デフォルトの名無しさん
2024/12/07(土) 21:42:37.76ID:1sWZyE4C ファイル名にはASCIIにある文字しか使わないようにすれば解決
137デフォルトの名無しさん
2024/12/07(土) 21:44:45.68ID:prVW7qhX >>136
ASCII のバックスラッシュが円記号になってしまう OS がるらしい
ASCII のバックスラッシュが円記号になってしまう OS がるらしい
138デフォルトの名無しさん
2024/12/08(日) 03:07:43.02ID:h9KuPnHR >>136
じゃあまずはASCII以外でここに書き込むのやめろよ
じゃあまずはASCII以外でここに書き込むのやめろよ
139デフォルトの名無しさん
2024/12/08(日) 04:05:29.89ID:Xxla/ZnP >>138
ここにファイル名を書いてる人あまりいないと思うんだけど?
ここにファイル名を書いてる人あまりいないと思うんだけど?
140デフォルトの名無しさん
2024/12/09(月) 11:25:01.55ID:uh4vUAM3 波ダッシュ(〜)と全角チルダ(〜)は違う文字
141デフォルトの名無しさん
2024/12/09(月) 12:17:56.89ID:Ne3E3UJU JISで全角チルダ定義したのがアレだよな
全角しか表示できない場面のためだろうけど
全角しか表示できない場面のためだろうけど
142デフォルトの名無しさん
2024/12/09(月) 14:00:31.58ID:4HU/GnaT >>141
JIS は全角と半角とか定義してない(定期
JIS は全角と半角とか定義してない(定期
143デフォルトの名無しさん
2024/12/09(月) 14:37:46.18ID:+G8yezOA144デフォルトの名無しさん
2024/12/09(月) 15:02:44.75ID:4HU/GnaT145デフォルトの名無しさん
2024/12/09(月) 17:46:32.24ID:bX1qj24S この板には表層的にMSを持ち出すだけで思考停止する若干一名がいるね
146デフォルトの名無しさん
2024/12/09(月) 18:34:12.95ID:4HU/GnaT >>145
シフトJISの「波ダーシ」を unicode の「全角チルダ」にマッピングする CP932 を規定したのはマイクロソフト
マイクロソフト以外の Linux とか MacOS とかその他の各社OSではそうなっていない
マイクロソフトが何でこんなマッピングにしたのかは専門家でも分かんない謎
unicode がまだドラフトの時代にあわてて作業したのでミスっただけの可能性も指摘されてるが、一度決めたものは互換性のために変えられないのだろう点は理解できる
シフトJISの「波ダーシ」を unicode の「全角チルダ」にマッピングする CP932 を規定したのはマイクロソフト
マイクロソフト以外の Linux とか MacOS とかその他の各社OSではそうなっていない
マイクロソフトが何でこんなマッピングにしたのかは専門家でも分かんない謎
unicode がまだドラフトの時代にあわてて作業したのでミスっただけの可能性も指摘されてるが、一度決めたものは互換性のために変えられないのだろう点は理解できる
147デフォルトの名無しさん
2024/12/09(月) 23:51:59.27ID:TvtcjS7H マイクロソフト憎しにも程がある
デマだめ絶対
デマだめ絶対
148デフォルトの名無しさん
2024/12/13(金) 01:50:01.54ID:XDI5kMlm マイクロソフトの場合親の敵の可能性があるから俺は許すね
気の済むまでじゃんじゃんやっといてくれ
気の済むまでじゃんじゃんやっといてくれ
149デフォルトの名無しさん
2024/12/13(金) 02:14:20.18ID:OiDxg/7M unicode 規格が最初に作られた時サイトに参考情報として JIS と unicode のマッピング表が置いてあった
Linux も Mac も商用Unixもこの表に従ってJISの波ダーシを unicode の wave dash にマッピングした。さらに JISの規格書にもこのマッピングで記載された
ただ Microsoft 1社だけは JIS の波ダーシを unicode の fullwidth tilde にマッピングした
こんなんマイクロソフトの中の人以外に理由が分かるわけねーだろ
Linux も Mac も商用Unixもこの表に従ってJISの波ダーシを unicode の wave dash にマッピングした。さらに JISの規格書にもこのマッピングで記載された
ただ Microsoft 1社だけは JIS の波ダーシを unicode の fullwidth tilde にマッピングした
こんなんマイクロソフトの中の人以外に理由が分かるわけねーだろ
150デフォルトの名無しさん
2024/12/13(金) 11:09:50.07ID:ncXjn+FF 初期のUnicode仕様書の文字の形がおかしかったのがそもそもの原因なんだけどね
いまの仕様書では、〜(U+301C、波ダッシュ)は、~(U+FF5E、全角チルダ)と同じ字形だけど、
古いものは、上下反転した存在しない文字の形だったので、どちらに合わせるかを決める時点で、
MSは形の相似した全角チルダのU+FF5Eを、その他は仕様どおりの波ダッシュのU+301Cを割り当てた
更にMacは仕様書を無視して字形を変更し、現在の仕様書と同じようにU+301Cに本来の波ダッシュの形を割り当てた
ただ、上下反転した字形は、縦書きの際の全角チルダ(左右の順)文字を横書きにしたために紛れ込んだとも言われているので、
仕様書制定の段階で縦書きのある日本語を理解した人が加わっていなかったのだろうな
まぁ、仕様書の字形がおかしかったことがそもそもの原因ではあるけれど、
これの対応を話し合いをすることなく各社で独自に行なってしまったというのが一番大きいな
結局、日本語が軽んじられていたんだろうけど、なんとも間抜けな話
いまの仕様書では、〜(U+301C、波ダッシュ)は、~(U+FF5E、全角チルダ)と同じ字形だけど、
古いものは、上下反転した存在しない文字の形だったので、どちらに合わせるかを決める時点で、
MSは形の相似した全角チルダのU+FF5Eを、その他は仕様どおりの波ダッシュのU+301Cを割り当てた
更にMacは仕様書を無視して字形を変更し、現在の仕様書と同じようにU+301Cに本来の波ダッシュの形を割り当てた
ただ、上下反転した字形は、縦書きの際の全角チルダ(左右の順)文字を横書きにしたために紛れ込んだとも言われているので、
仕様書制定の段階で縦書きのある日本語を理解した人が加わっていなかったのだろうな
まぁ、仕様書の字形がおかしかったことがそもそもの原因ではあるけれど、
これの対応を話し合いをすることなく各社で独自に行なってしまったというのが一番大きいな
結局、日本語が軽んじられていたんだろうけど、なんとも間抜けな話
151デフォルトの名無しさん
2024/12/13(金) 11:39:54.50ID:OiDxg/7M >>150
仕様書も文字の形がおかしかったはネットの素人が勝手に推測した迷信、文字形は規定していない
文字コード的にはフォントで変わる文字の形は意味がない
unicode の wave dash は JIS 第一水準の波ダージなどに対応する文字として準備された
unicode の互換領域の fullwidth tilde は EUC-JP とかで使用されいたJIS補助漢字のチルダをマッピングするために準備された
EUC-JP では ASCII の1バイト文字のチルダと補助漢字の2倍と文字のチルダに両方が使われていたので互換領域が必要だった
仕様書も文字の形がおかしかったはネットの素人が勝手に推測した迷信、文字形は規定していない
文字コード的にはフォントで変わる文字の形は意味がない
unicode の wave dash は JIS 第一水準の波ダージなどに対応する文字として準備された
unicode の互換領域の fullwidth tilde は EUC-JP とかで使用されいたJIS補助漢字のチルダをマッピングするために準備された
EUC-JP では ASCII の1バイト文字のチルダと補助漢字の2倍と文字のチルダに両方が使われていたので互換領域が必要だった
152デフォルトの名無しさん
2025/01/11(土) 13:26:51.55ID:ftPdDy1W なんか文字コード絡みでWindowsに特大級のセキュリティホールが見つかったぽい
https://blog.orange.tw/posts/2025-01-worstfit-unveiling-hidden-transformers-in-windows-ansi/
https://blog.orange.tw/posts/2025-01-worstfit-unveiling-hidden-transformers-in-windows-ansi/
153デフォルトの名無しさん
2025/01/11(土) 13:36:00.86ID:ftPdDy1W CP65001で緩和可能ってことであってるよね?
超ヤバげなんでageるよ
超ヤバげなんでageるよ
154デフォルトの名無しさん
2025/01/11(土) 13:52:24.87ID:wkEhpAnW155デフォルトの名無しさん
2025/01/11(土) 15:04:27.58ID:mk8LdH4O やべーやつだこれ
終わったな...
終わったな...
156デフォルトの名無しさん
2025/01/11(土) 15:07:44.39ID:MN266Dik とうとう Windows の Best-Fit-Conversion が槍玉にあげられたか
これって多数の個別アプリの問題に矮小化されてきたけどどう考えてもOSの設計ミスにしかみえない
これって多数の個別アプリの問題に矮小化されてきたけどどう考えてもOSの設計ミスにしかみえない
157デフォルトの名無しさん
2025/01/11(土) 16:08:55.10ID:IZON3iKr 件のBestFit機能のせいで、
windowsバッチでフルパスが半角スペースなし全角スペースありだと、
どのようにクォーティングをしようともまともに動かなくなったわけか
windowsバッチでフルパスが半角スペースなし全角スペースありだと、
どのようにクォーティングをしようともまともに動かなくなったわけか
158デフォルトの名無しさん
2025/01/11(土) 16:17:43.05ID:PjVvqmiz システム設定でUTF8にするとメモ帳でSJISテキストファイルが文字化けする訳だけど
この特需で伸ばす代替エディタは何か?
この特需で伸ばす代替エディタは何か?
159デフォルトの名無しさん
2025/01/11(土) 16:20:20.66ID:PjVvqmiz 場合によっては情シスがSJISテキストファイルリストアップツールを用意する事になりそう
160デフォルトの名無しさん
2025/01/11(土) 16:29:41.49ID:IZON3iKr UTF-8に設定すると、JaneStyleは今度こそ本当に使えなくなるんだよな
161デフォルトの名無しさん
2025/01/11(土) 16:37:08.97ID:8GlegYBS ファイル名に禁則文字を増やしても避けられないのだろうか?
162デフォルトの名無しさん
2025/01/11(土) 16:50:18.36ID:SJ4Pziuh これを機に932以外では文字化けするレガシーアプリは駆逐されれば良い
163デフォルトの名無しさん
2025/01/11(土) 17:11:19.10ID:MN266Dik >>161
ファイル名の禁則レベルでは無理
Unicode の一部の文字がバックスラッシュとか空白とかクォートとかの区切り文字や特殊処理する文字に化けるので、これを利用して入力を誤魔化せるという技
どう化けるかはコードページ次第
全部のアプリがユニコード対応になるか Windows が BestFit やめない限りは多くのアプリで同様の問題が量産される(オープンソース系のアプリはこれはOSの仕様のせいでアプリのバグじゃないので直すつもりはないとか言ってる)
UTF-8だとBestFit使われないので Windows 12 とかで SJIS とか Win-1521 とか捨ててデフォルトが UTF-8 になれば解決するけど
ファイル名の禁則レベルでは無理
Unicode の一部の文字がバックスラッシュとか空白とかクォートとかの区切り文字や特殊処理する文字に化けるので、これを利用して入力を誤魔化せるという技
どう化けるかはコードページ次第
全部のアプリがユニコード対応になるか Windows が BestFit やめない限りは多くのアプリで同様の問題が量産される(オープンソース系のアプリはこれはOSの仕様のせいでアプリのバグじゃないので直すつもりはないとか言ってる)
UTF-8だとBestFit使われないので Windows 12 とかで SJIS とか Win-1521 とか捨ててデフォルトが UTF-8 になれば解決するけど
164デフォルトの名無しさん
2025/01/11(土) 17:17:54.37ID:IZON3iKr システムをUTF-8に設定した上で、
CP932なアプリについて、個別のマニフェストの"activeCodePage"を"CP932"することで使えるようにならないんだろうか?
CP932なアプリについて、個別のマニフェストの"activeCodePage"を"CP932"することで使えるようにならないんだろうか?
165デフォルトの名無しさん
2025/01/11(土) 17:23:40.51ID:MN266Dik >>164
今のところできないし、できたとしてもその cp932 に設定したプログラムで BestFit による抜け穴が使われるリスクがある
今のところできないし、できたとしてもその cp932 に設定したプログラムで BestFit による抜け穴が使われるリスクがある
166デフォルトの名無しさん
2025/01/11(土) 17:41:24.43ID:8GlegYBS ファイル名に英数字以外禁止したら何とかなりそうな気はした
167デフォルトの名無しさん
2025/01/11(土) 17:49:38.65ID:MN266Dik168デフォルトの名無しさん
2025/01/11(土) 22:53:43.82ID:ftPdDy1W Windows全然詳しくないんだけど、Windows APIのANSI APIとUnicode APIとの違いって
標準Cライブラリの文字出力で言えばprintfとwprintfとの違いってことだよね?
世の中のOSSのほとんどはwprintf等のワイド文字関数なんて使っていないんだから
OSSをWindowsで動かした場合ほぼ全部WorstFitの影響を受けることになるはず
今後基本的にワイド文字関数で書くべきってなると、Hello Worldは
#include <stdio.h>
#include <locale.h>
#include <wchar.h>
int main(int argc, char **argv)
{
setlocale(LC_ALL, "");
wprintf(L"こんにちは世界\n");
}
こうすべきってこと?
標準Cライブラリの文字出力で言えばprintfとwprintfとの違いってことだよね?
世の中のOSSのほとんどはwprintf等のワイド文字関数なんて使っていないんだから
OSSをWindowsで動かした場合ほぼ全部WorstFitの影響を受けることになるはず
今後基本的にワイド文字関数で書くべきってなると、Hello Worldは
#include <stdio.h>
#include <locale.h>
#include <wchar.h>
int main(int argc, char **argv)
{
setlocale(LC_ALL, "");
wprintf(L"こんにちは世界\n");
}
こうすべきってこと?
169デフォルトの名無しさん
2025/01/11(土) 23:28:05.92ID:ftPdDy1W あ、
int main(int argc, char **argv)
エントリーポイントの時点で引数がワイド文字じゃないから脆弱性の影響を受ける可能性があるのか
wmainがあるのはそういう理由なのね
int main(int argc, char **argv)
エントリーポイントの時点で引数がワイド文字じゃないから脆弱性の影響を受ける可能性があるのか
wmainがあるのはそういう理由なのね
170デフォルトの名無しさん
2025/01/12(日) 08:20:59.76ID:xo4UH4ro MS的には「いまだにワイド文字列使ってないアプリが悪い」なんだよな
171デフォルトの名無しさん
2025/01/12(日) 11:43:06.44ID:2Lg/ICMd >>170
最近は ANSI は UTF-8 に固定しろとか言い出してる
最近は ANSI は UTF-8 に固定しろとか言い出してる
172デフォルトの名無しさん
2025/01/12(日) 12:45:56.54ID:/g6mpPgl173デフォルトの名無しさん
2025/01/13(月) 13:47:41.46ID:g4/CTboD UTF-8に一本化されるなら嬉しいな
174デフォルトの名無しさん
2025/01/13(月) 21:19:29.06ID:5zeCvv1K Windows アプリで UTF-8 コード ページを使用する
https://learn.microsoft.com/ja-jp/windows/apps/design/globalizing/use-utf8-code-page
https://learn.microsoft.com/ja-jp/windows/apps/design/globalizing/use-utf8-code-page
175デフォルトの名無しさん
2025/01/13(月) 23:50:34.22ID:ux79df1f 初めから文字列はUTF-8と言語仕様&標準ライブラリで決めてあるRustが楽でいいね
もちろん必要ならUTF-8以外も読み書き可
もちろん必要ならUTF-8以外も読み書き可
176デフォルトの名無しさん
2025/01/17(金) 17:07:09.01ID:GO6/DX25 pythonも楽ちんちん
177デフォルトの名無しさん
2025/01/18(土) 03:52:04.02ID:CaguG0TX RustがWindowsでファイル名を扱う時のWTF-8、あれ脆弱性の元な気がするんだよな…
WTF-8状態でサロゲートペアの前後を結合してしまうとUTF-8のとはまた別の冗長表現が導入されてしまう
WTF-8状態でサロゲートペアの前後を結合してしまうとUTF-8のとはまた別の冗長表現が導入されてしまう
178デフォルトの名無しさん
2025/01/18(土) 09:40:44.96ID:ryxfYm1H179デフォルトの名無しさん
2025/01/18(土) 10:15:43.69ID:CaguG0TX >>178
UTF-8では違反なサロゲートの片方だけを許すのがWTF-8なので
正常なサロゲートペアをUTF-8に変換したときの4〜6バイト表現に対して
WTF-8ではペアの片割れを別々に変換して結合した3バイトのサロゲート片☓2な別表現が存在できてしまうでしょ
これらはUTF-16に戻したら同じ文字列になってしまうので
WTF-8で比較等の処理をしてUTF-16に戻すと脆弱性になっちゃう
UTF-8では違反なサロゲートの片方だけを許すのがWTF-8なので
正常なサロゲートペアをUTF-8に変換したときの4〜6バイト表現に対して
WTF-8ではペアの片割れを別々に変換して結合した3バイトのサロゲート片☓2な別表現が存在できてしまうでしょ
これらはUTF-16に戻したら同じ文字列になってしまうので
WTF-8で比較等の処理をしてUTF-16に戻すと脆弱性になっちゃう
180デフォルトの名無しさん
2025/01/18(土) 10:40:31.12ID:ryxfYm1H >>179
色々間違えてる
UTF-8では片側だろうと両方だろうとサロゲート領域のコードは許されてない。あったらUTF-8じゃない
サロゲート導入前の古いUTF-8規格を参照してるアホがいるだけ
UTF-8は最大長で1文字4バイト、それ以上長いのは今のUTF-8では許されない
ましてWTF-8とか名前変えてもユニコード規格の対象外、UTF-8ではない
色々間違えてる
UTF-8では片側だろうと両方だろうとサロゲート領域のコードは許されてない。あったらUTF-8じゃない
サロゲート導入前の古いUTF-8規格を参照してるアホがいるだけ
UTF-8は最大長で1文字4バイト、それ以上長いのは今のUTF-8では許されない
ましてWTF-8とか名前変えてもユニコード規格の対象外、UTF-8ではない
181デフォルトの名無しさん
2025/01/18(土) 10:44:27.05ID:CaguG0TX >>180
最初っからWTF-8って言ってるじゃん
最初っからWTF-8って言ってるじゃん
182デフォルトの名無しさん
2025/01/18(土) 10:49:44.07ID:CaguG0TX Windowsのファイルシステムでは文字コードとしては不正なバイト列がファイル名として存在できる
それを8バイト文字列で無理やり扱うためRustではWTF-8という本来エラーになる表現も許容した規格違反UTF-8を使っている
OK?
それを8バイト文字列で無理やり扱うためRustではWTF-8という本来エラーになる表現も許容した規格違反UTF-8を使っている
OK?
183デフォルトの名無しさん
2025/01/18(土) 11:09:46.05ID:ryxfYm1H だから WTF-8 は UTF-8 とは違う
別物なんだから混同しなければ脆弱性にはならない
別物なんだから混同しなければ脆弱性にはならない
184デフォルトの名無しさん
2025/01/18(土) 11:15:32.70ID:CaguG0TX Rustではファイル名をWTF-8で扱うけどWTF-8で文字列処理すると危なくね?ってそれだけの話だよ
UTF-8の話と混同して絡んできたのはあんたじゃね
UTF-8の話と混同して絡んできたのはあんたじゃね
185デフォルトの名無しさん
2025/01/18(土) 11:27:52.60ID:7Jaib8zo m1Hは馬鹿ちんちん
186デフォルトの名無しさん
2025/01/18(土) 11:33:32.09ID:ryxfYm1H WTF-8 の文字列を UTF-8 の比較関数とかで処理しようとしてもうまくいかない → 当たり前
これは脆弱性ではないし、冗長性も関係ない
ここまでは理解できてるんだよな?
WTF-8 が別規格なんだからそれ専用の処理コードが必要ってだけだろ
UTF-8ではないので混同するなって話
これは脆弱性ではないし、冗長性も関係ない
ここまでは理解できてるんだよな?
WTF-8 が別規格なんだからそれ専用の処理コードが必要ってだけだろ
UTF-8ではないので混同するなって話
187デフォルトの名無しさん
2025/01/18(土) 11:36:02.21ID:CaguG0TX もう自分が何書いてるかもわかってなさそう
もう一度読んで?
もう一度読んで?
188デフォルトの名無しさん
2025/01/18(土) 11:44:30.94ID:rGNNXTeE 横通ります
Rustではディレクトリを開いてスキャンしたら各ファイル名はWTF-8とやらのスライスなのか?
Rustではディレクトリを開いてスキャンしたら各ファイル名はWTF-8とやらのスライスなのか?
189デフォルトの名無しさん
2025/01/18(土) 11:46:24.96ID:rGNNXTeE それとLinuxのファイルシステム自体もUTF-8文字コードを外れてもOKだから、Windowsに限った話ではないかと
LTF-8もあるのか?
LTF-8もあるのか?
190デフォルトの名無しさん
2025/01/18(土) 12:03:49.92ID:CaguG0TX >>188-189
型としてはOsStringとしてラップされてて、中身を取り出したらWindowsではWTF-8
不正な文字コードが入りうるのはどのOSでも同じだけどバイト列そのままな他OSと異なりWindowsだとUTF-16との変換も挟まって危なそうだなあって
(ちなmacOSやあとBSDのzfsなんかだと不正な文字コードは最初から入らないらしい?)
型としてはOsStringとしてラップされてて、中身を取り出したらWindowsではWTF-8
不正な文字コードが入りうるのはどのOSでも同じだけどバイト列そのままな他OSと異なりWindowsだとUTF-16との変換も挟まって危なそうだなあって
(ちなmacOSやあとBSDのzfsなんかだと不正な文字コードは最初から入らないらしい?)
191188-189
2025/01/18(土) 12:30:08.19ID:ZXpOcGU5 >>190
なるほどね納得
不正な文字コードに遭遇したら処理を進めないで即座にエラーにするが良さそう
問題は処理系がちゃんと不正な文字コードを感知するかどうかだけど、
WindowsでA系APIを使っていれば(RawワイドストリングのUTF-16解釈が試みられて)
不正なパラメータエラーとかで(ディレクトリスキャン時などの)早期に発見できそうな気がする
なるほどね納得
不正な文字コードに遭遇したら処理を進めないで即座にエラーにするが良さそう
問題は処理系がちゃんと不正な文字コードを感知するかどうかだけど、
WindowsでA系APIを使っていれば(RawワイドストリングのUTF-16解釈が試みられて)
不正なパラメータエラーとかで(ディレクトリスキャン時などの)早期に発見できそうな気がする
192デフォルトの名無しさん
2025/01/18(土) 12:32:48.77ID:ryxfYm1H なんだろうな?
UTF-8: 片サロゲートも両サロゲートも不可
WTF-8: 片サロゲートのみ可、両サロゲートは不可
CESU-8: サロゲート展開必須
という区別がちゃんとついてるんだろうかという疑問、これら混ぜれば冗長だが…
単独で冗長と言われても具体性がない
UTF-8: 片サロゲートも両サロゲートも不可
WTF-8: 片サロゲートのみ可、両サロゲートは不可
CESU-8: サロゲート展開必須
という区別がちゃんとついてるんだろうかという疑問、これら混ぜれば冗長だが…
単独で冗長と言われても具体性がない
193デフォルトの名無しさん
2025/01/20(月) 21:45:49.79ID:fFffNKjx 勘違いしてる人がいるため正しい情報
まずRustの文字列つまりstr型とString型はvalidなUTF-8のみであることが必ず保証されている
そこには当然サロゲートもなければinvalidなUTF-8もないため問題は一切起きない
そこにWTF-8など他のものが混ざることも絶対にない
つまりどんな文字列操作をしても冗長表現のない
validなUTF-8となる安全が保証されている
つづく
まずRustの文字列つまりstr型とString型はvalidなUTF-8のみであることが必ず保証されている
そこには当然サロゲートもなければinvalidなUTF-8もないため問題は一切起きない
そこにWTF-8など他のものが混ざることも絶対にない
つまりどんな文字列操作をしても冗長表現のない
validなUTF-8となる安全が保証されている
つづく
194デフォルトの名無しさん
2025/01/20(月) 21:46:25.68ID:fFffNKjx 次に言語とは関係ない話
validなUTF-16は必ずサロゲートがペアとして対応するが
それに対してWindowsのUTF-16パス名などあちこちの環境でinvalidなUTF-16が使われている
つまり単なる16bitコード列として任意のものが通るinvalidなUTF-16を名付けてWTF-16と呼ぶ
UTFを擬してWTFはWobbly Transformation Formatの略である
集合としてはinvalidなものを含む分だけ大きくてWTF-16⊃UTF-16となる
つづく
validなUTF-16は必ずサロゲートがペアとして対応するが
それに対してWindowsのUTF-16パス名などあちこちの環境でinvalidなUTF-16が使われている
つまり単なる16bitコード列として任意のものが通るinvalidなUTF-16を名付けてWTF-16と呼ぶ
UTFを擬してWTFはWobbly Transformation Formatの略である
集合としてはinvalidなものを含む分だけ大きくてWTF-16⊃UTF-16となる
つづく
195デフォルトの名無しさん
2025/01/20(月) 21:47:00.81ID:fFffNKjx UTF-16⇔UTF-8は常に可逆に変換できる
前述のWTF-16に対しても同様に可逆となるものとしてWTF-8が考えられる
つまりWTF-16⇔WTF-8は常に可逆に変換できる
前述のWTF-16⊃UTF-16と同様に
WTF-8⊃UTF-8となる
このWTF-8はあくまでもWTF-16との可逆を保証するための内部表現であり外で使われることはない
つづく
前述のWTF-16に対しても同様に可逆となるものとしてWTF-8が考えられる
つまりWTF-16⇔WTF-8は常に可逆に変換できる
前述のWTF-16⊃UTF-16と同様に
WTF-8⊃UTF-8となる
このWTF-8はあくまでもWTF-16との可逆を保証するための内部表現であり外で使われることはない
つづく
196デフォルトの名無しさん
2025/01/20(月) 21:48:06.23ID:fFffNKjx このWTF-8には以下の利点がある
・WTF-16(=任意の16bit列)と可逆に1対1に変換できる
・元のWTF-16がUTF-16のみの場合は対応するWTF-8はUTF-8のみとなる
・特に元がアスキー文字のみならば対応するWTF-8は7bitアスキー文字となる
集合関係はWTF-8⊃UTF-8⊃7bitアスキー文字となる
つまり内部表現として非常に使い勝手が良いものとなっている
つづく
・WTF-16(=任意の16bit列)と可逆に1対1に変換できる
・元のWTF-16がUTF-16のみの場合は対応するWTF-8はUTF-8のみとなる
・特に元がアスキー文字のみならば対応するWTF-8は7bitアスキー文字となる
集合関係はWTF-8⊃UTF-8⊃7bitアスキー文字となる
つまり内部表現として非常に使い勝手が良いものとなっている
つづく
197デフォルトの名無しさん
2025/01/20(月) 21:49:23.00ID:fFffNKjx そしてようやく再びRustの話
Rustでは言語の外の世界とをつなぐFFI (Foreign Function Initerface)の一つとして
OS環境依存の文字列型としてOsString型とOsStr型がある
これはvalidなUTF-8文字列型であるString型とstr型にそれぞれ対応する
集合的にはOsString⊃StringとOsStr⊃strとなりinvalidなUTF-8を含む分だけ大きな集合を表す
Windows環境ではこの内部表現として前述のWTF-8が使われている
つづく
Rustでは言語の外の世界とをつなぐFFI (Foreign Function Initerface)の一つとして
OS環境依存の文字列型としてOsString型とOsStr型がある
これはvalidなUTF-8文字列型であるString型とstr型にそれぞれ対応する
集合的にはOsString⊃StringとOsStr⊃strとなりinvalidなUTF-8を含む分だけ大きな集合を表す
Windows環境ではこの内部表現として前述のWTF-8が使われている
つづく
198デフォルトの名無しさん
2025/01/20(月) 21:50:56.30ID:fFffNKjx199デフォルトの名無しさん
2025/01/20(月) 22:03:03.35ID:SJIxPBxD Rustスレから出てこないで欲しいなあ
200デフォルトの名無しさん
2025/01/20(月) 22:15:46.02ID:fw0guZsp >>198
普通に結合で新しくOsStringを作ってる例がありますやん
ttps://doc.rust-lang.org/std/ffi/struct.OsString.html#capacity-of-osstring
普通に結合で新しくOsStringを作ってる例がありますやん
ttps://doc.rust-lang.org/std/ffi/struct.OsString.html#capacity-of-osstring
201デフォルトの名無しさん
2025/01/20(月) 22:20:59.93ID:SnLzVhb4 utf8とutf8を結合しても必ずutf8となるように
wtf8とwtf8を結合しても必ずwtf8だね
何を問題視しているのかな
wtf8とwtf8を結合しても必ずwtf8だね
何を問題視しているのかな
202デフォルトの名無しさん
2025/01/20(月) 22:26:06.74ID:fw0guZsp 何度も書いてるじゃないですか
サロゲートの片方だけなWTF-8同士を結合するとサロゲートペアが揃ってしまって本来あるべき形の別表現となるでしょ
その状態で比較等をすると狂いが生じる話
サロゲートの片方だけなWTF-8同士を結合するとサロゲートペアが揃ってしまって本来あるべき形の別表現となるでしょ
その状態で比較等をすると狂いが生じる話
203デフォルトの名無しさん
2025/01/20(月) 22:44:54.83ID:SnLzVhb4204デフォルトの名無しさん
2025/01/20(月) 22:51:08.98ID:uZ5HVjRv WTF-8 どうしを結合するときは終端処理をしてサロゲートの変換をしないといけない
UTF-8 のように単純に結合することできない
両サロゲートが含まれてるものはWTF-8ではない
UTF-8 のように単純に結合することできない
両サロゲートが含まれてるものはWTF-8ではない
205デフォルトの名無しさん
2025/01/20(月) 23:00:53.63ID:fw0guZsp206デフォルトの名無しさん
2025/01/20(月) 23:18:31.29ID:uZ5HVjRv >>205
片サロゲートはユニコード的には文字コードではないので片サロゲートの結合をどう処理するかは実装依存
捨てる、未定義文字に置き変える、文字だったことにしてUTF-8変換する、なんかのセパレータを挟むとかできるかもしれない
でも一般的と思われるのは結合処理自体をエラーで失敗させる
WTF-8 にも UTF-8 にも冗長性はない、WTF-8 を UTF-8 と同じように使ってはいけないだけ、両者は別物
片サロゲートはユニコード的には文字コードではないので片サロゲートの結合をどう処理するかは実装依存
捨てる、未定義文字に置き変える、文字だったことにしてUTF-8変換する、なんかのセパレータを挟むとかできるかもしれない
でも一般的と思われるのは結合処理自体をエラーで失敗させる
WTF-8 にも UTF-8 にも冗長性はない、WTF-8 を UTF-8 と同じように使ってはいけないだけ、両者は別物
207デフォルトの名無しさん
2025/01/20(月) 23:19:38.23ID:fFffNKjx >>204
そこで問題は生じない
WTF-8の2つの文字(列)の結合は
個別にWTF-16へ変換してからWTF-16として結合してそれをWTF-8へ変換したもの
と同等になるように処理が定義されている
つまり結合後も必ずWTF-8とWTF-16は1対1に対応する
WTF-8の2つの文字(列)をAとBとし結合を+で表すと
A + B ≡ to-WTF-8(to-WTF-16(A) + to-WTF-16(B))
が常に成り立ち1対1に可逆が保証される
別の冗長表現は生じない
そこで問題は生じない
WTF-8の2つの文字(列)の結合は
個別にWTF-16へ変換してからWTF-16として結合してそれをWTF-8へ変換したもの
と同等になるように処理が定義されている
つまり結合後も必ずWTF-8とWTF-16は1対1に対応する
WTF-8の2つの文字(列)をAとBとし結合を+で表すと
A + B ≡ to-WTF-8(to-WTF-16(A) + to-WTF-16(B))
が常に成り立ち1対1に可逆が保証される
別の冗長表現は生じない
208デフォルトの名無しさん
2025/01/20(月) 23:26:06.35ID:uZ5HVjRv >>206
一応補足しておくと、エラーなどの処理するのは結合時点でなくて、それを何か使おうとしたり、他の文字コードに変換しようとした時点とすることもできる
Invalid な WTF-8 のチェックをどの時点でするかだけの問題
一応補足しておくと、エラーなどの処理するのは結合時点でなくて、それを何か使おうとしたり、他の文字コードに変換しようとした時点とすることもできる
Invalid な WTF-8 のチェックをどの時点でするかだけの問題
209デフォルトの名無しさん
2025/01/20(月) 23:27:17.08ID:fw0guZsp210デフォルトの名無しさん
2025/01/20(月) 23:35:21.19ID:fw0guZsp211デフォルトの名無しさん
2025/01/20(月) 23:45:27.35ID:fFffNKjx >>209
それは任意の16bit列に対応するWTF-8を作れるようになっているのでその場合も対応できて大丈夫
use std::os::windows::ffi::OsStringExt
OsString::from_wide(wide: &[u16])
つまりWTF-16⇔WTF-8は必ず1対1に対応するため別の冗長表現は生じず問題は起こらない
それは任意の16bit列に対応するWTF-8を作れるようになっているのでその場合も対応できて大丈夫
use std::os::windows::ffi::OsStringExt
OsString::from_wide(wide: &[u16])
つまりWTF-16⇔WTF-8は必ず1対1に対応するため別の冗長表現は生じず問題は起こらない
212デフォルトの名無しさん
2025/01/20(月) 23:52:28.98ID:fFffNKjx つまり話をまとめると
WTF-8の新規生成はUTF-8もしくはWTF-16(=任意の16bit列)からのみ生成できるため常にWTF-16と1対1に対応する
WTF-8の結合は個別にWTF-16にしてから結合してWTF-8に戻した処理と同等と定義されているため常にWTF-16と1対1に対応する
したがって問題が発生する箇所はない
WTF-8の新規生成はUTF-8もしくはWTF-16(=任意の16bit列)からのみ生成できるため常にWTF-16と1対1に対応する
WTF-8の結合は個別にWTF-16にしてから結合してWTF-8に戻した処理と同等と定義されているため常にWTF-16と1対1に対応する
したがって問題が発生する箇所はない
213デフォルトの名無しさん
2025/01/21(火) 00:05:41.71ID:HFAykEjr >>212
異論というわけじゃないが、そもそもWTF-16どうしをそのまま結合して良いかというと必ずしもそうではない
WTF-16をそのまま結合して許される条件下まらWTF-8の結合を終端でサロゲートが並んだらUTF-8変換するというのは間違ってないけど
まあどっちにしろ正しく処理すれば冗長性はない
異論というわけじゃないが、そもそもWTF-16どうしをそのまま結合して良いかというと必ずしもそうではない
WTF-16をそのまま結合して許される条件下まらWTF-8の結合を終端でサロゲートが並んだらUTF-8変換するというのは間違ってないけど
まあどっちにしろ正しく処理すれば冗長性はない
214デフォルトの名無しさん
2025/01/21(火) 00:39:07.85ID:HFAykEjr ファイル名に文字ではないゴミが含まれている → 実際に含まれているだから仕方ないOSの問題
ゴミとゴミをくっつけると文字になる → OSの問題でも文字コードの問題でもない、許すかどうかはアプリの問題
ゴミとゴミをくっつけると文字になる → OSの問題でも文字コードの問題でもない、許すかどうかはアプリの問題
215デフォルトの名無しさん
2025/01/21(火) 00:52:01.60ID:HFAykEjr ゴミの結合をして文字になることを許すと冗長性とは別のセキュリティホールになることがある
文字のフィルターとかで文字列Aにも文字列Bにも含まれてないことを確認した文字が A+B に含まれるかもしれない
これは最近に始まったことではなくて SJIS
とか EUC-JP とかでもあった問題で、セキュリティ要件ではゴミの単純な結合は許さないのがベスト・プラクティス
文字のフィルターとかで文字列Aにも文字列Bにも含まれてないことを確認した文字が A+B に含まれるかもしれない
これは最近に始まったことではなくて SJIS
とか EUC-JP とかでもあった問題で、セキュリティ要件ではゴミの単純な結合は許さないのがベスト・プラクティス
216デフォルトの名無しさん
2025/01/21(火) 01:27:51.08ID:cx2WozxM いずれにせよRustの文字列処理には何ら問題なくて
WTF-8の処理にも何ら問題ないことがわかったのだから
最初の書き込みのこの人が間違っていたな
>>177
>>RustがWindowsでファイル名を扱う時のWTF-8、あれ脆弱性の元な気がするんだよな…
WTF-8で脆弱性が引き起こされないことも今回はっきりした
あとはもし何かあるとすればWindows側の問題のみ
WTF-8の処理にも何ら問題ないことがわかったのだから
最初の書き込みのこの人が間違っていたな
>>177
>>RustがWindowsでファイル名を扱う時のWTF-8、あれ脆弱性の元な気がするんだよな…
WTF-8で脆弱性が引き起こされないことも今回はっきりした
あとはもし何かあるとすればWindows側の問題のみ
217デフォルトの名無しさん
2025/01/21(火) 06:06:40.49ID:/BTcOxxh218デフォルトの名無しさん
2025/01/21(火) 07:33:55.78ID:CGf2GAkC219デフォルトの名無しさん
2025/01/21(火) 07:42:06.00ID:4+X4XnDl まあ抽象的なコードポイントの話じゃなくて、エンコーディングの話、例えば
> WTF-16(=任意の16bit列)
と言ってるから
> WTF-8⊃UTF-8となる
も8bit列を意図してるのなら、成り立たないな。
WTF-8に関しては、WTF-8(=任意の16bit列)ではなくて、
絵文字などをUTF-8エンコードした8bit列は、WTF-8では不正な8bit列となる。
> WTF-16(=任意の16bit列)
と言ってるから
> WTF-8⊃UTF-8となる
も8bit列を意図してるのなら、成り立たないな。
WTF-8に関しては、WTF-8(=任意の16bit列)ではなくて、
絵文字などをUTF-8エンコードした8bit列は、WTF-8では不正な8bit列となる。
220デフォルトの名無しさん
2025/01/21(火) 07:43:40.53ID:4+X4XnDl 訂正
WTF-8に関しては、WTF-8(=任意の8bit列)ではなくて、
WTF-8に関しては、WTF-8(=任意の8bit列)ではなくて、
221デフォルトの名無しさん
2025/01/21(火) 08:02:21.62ID:CGf2GAkC >>219
>>絵文字などをUTF-8エンコードした8bit列は、WTF-8では不正な8bit列となる。
それは君が勘違いしてるよ
UTF-8エンコードした8bit列は必ず有効なWTF-8になるが正しい
反論があるならUTF-8がWTF-8とならない場合のプログラム例を出そう
>>絵文字などをUTF-8エンコードした8bit列は、WTF-8では不正な8bit列となる。
それは君が勘違いしてるよ
UTF-8エンコードした8bit列は必ず有効なWTF-8になるが正しい
反論があるならUTF-8がWTF-8とならない場合のプログラム例を出そう
222デフォルトの名無しさん
2025/01/21(火) 08:06:50.62ID:6E3WwSvm >>221
それを含めた時が冗長性誕生の瞬間である
それを含めた時が冗長性誕生の瞬間である
223デフォルトの名無しさん
2025/01/21(火) 08:11:27.09ID:CGf2GAkC224デフォルトの名無しさん
2025/01/21(火) 08:59:02.25ID:HFAykEjr WTF-8 は定義からして冗長性はない、プログラム以前の問題
WTF-8 は UTF-8 に加えて片サロゲートをUTF-8変換したものが含まれているだけ
サロゲート前半とサロゲート後半の連続も許されてない
それが混じったらWTF-8じゃない
WTF-8∋UTF-8 → ✕
WTF-8⊃UTF-8 → ○
任意の16bit列 = WTF-16 → ○ (未定義文字などを許す前提)
任意の8bit列 = WTF-8 → ✕
WTF-16 と WTF-8 は冗長性なく1対1対応 → ○
基本が分かってないやつがいるので議論が噛み合ってないだけのようだ
WTF-8 は UTF-8 に加えて片サロゲートをUTF-8変換したものが含まれているだけ
サロゲート前半とサロゲート後半の連続も許されてない
それが混じったらWTF-8じゃない
WTF-8∋UTF-8 → ✕
WTF-8⊃UTF-8 → ○
任意の16bit列 = WTF-16 → ○ (未定義文字などを許す前提)
任意の8bit列 = WTF-8 → ✕
WTF-16 と WTF-8 は冗長性なく1対1対応 → ○
基本が分かってないやつがいるので議論が噛み合ってないだけのようだ
225デフォルトの名無しさん
2025/01/21(火) 09:11:27.73ID:nn8C9EMv226デフォルトの名無しさん
2025/01/21(火) 09:23:46.18ID:snb5MXpj WTF-8に冗長表現は起きず脆弱性はないね
冗長が起きると書き込んでる人は、理解できずに間違った思い込みをしているのか、悔しくてデマを繰り返してるのか、わからんけどさ
冗長表現を生成する具体例を一つ示せば済むのに、ここまで来ても一つも示せていない
冗長が起きると書き込んでる人は、理解できずに間違った思い込みをしているのか、悔しくてデマを繰り返してるのか、わからんけどさ
冗長表現を生成する具体例を一つ示せば済むのに、ここまで来ても一つも示せていない
227デフォルトの名無しさん
2025/01/21(火) 10:25:40.02ID:uiolM7XA 帰れ
228デフォルトの名無しさん
2025/01/21(火) 11:37:21.93ID:q2HQSFd2 >>215の言うAにもBにも含まれない「文字」がA+Bに含まれるかもしれない問題、
処理の正しさの観点では(脆弱性の話は置いておいて)
NFC/NFDやIVS/IVD/ZWJ絡みで(well formed UTF-8同士の範囲でも)発生する気がするけど
実際にA+Bを作ってからチェックするのが鉄則なのか?
「文字」じゃなくて「文字列」ならA+Bを作るのが普通と思う
(それと正規表現なら部分マッチが出来たりする)
処理の正しさの観点では(脆弱性の話は置いておいて)
NFC/NFDやIVS/IVD/ZWJ絡みで(well formed UTF-8同士の範囲でも)発生する気がするけど
実際にA+Bを作ってからチェックするのが鉄則なのか?
「文字」じゃなくて「文字列」ならA+Bを作るのが普通と思う
(それと正規表現なら部分マッチが出来たりする)
229デフォルトの名無しさん
2025/01/21(火) 12:16:20.66ID:HFAykEjr230デフォルトの名無しさん
2025/01/21(火) 12:47:14.29ID:mXSJj++Z そんなの要件定義考慮漏れで溢れかえってる
何かあったら現状を仕様にする
何かあったら現状を仕様にする
231デフォルトの名無しさん
2025/01/21(火) 16:35:46.77ID:3Vt9EG/U ライブラリ側に問題がないとはいえ過信はよろしくない
OsStringでは機能が足りず中身を取り出しての直接処理はよくやられてるし
余計な変換をかましてるせいで考慮することが増えてしまってる一方でアプリ側にはWindowsの特殊事情なんて考慮してないコードも山ほどあろう
OsStringでは機能が足りず中身を取り出しての直接処理はよくやられてるし
余計な変換をかましてるせいで考慮することが増えてしまってる一方でアプリ側にはWindowsの特殊事情なんて考慮してないコードも山ほどあろう
232デフォルトの名無しさん
2025/01/21(火) 17:20:43.69ID:HFAykEjr >>231
だから最初から WTF-8 は UTF-8 とは別物
混同したら問題、混同しなければ問題はない
UTF-8 ではサロゲート断片は許されない
WTF-8 ではサロゲートの片側だけ許されるがそのせいで追加の処理が必要
冗長性うんぬんを言い出すのはこの違いが分かってないやつという話題だろ
だから最初から WTF-8 は UTF-8 とは別物
混同したら問題、混同しなければ問題はない
UTF-8 ではサロゲート断片は許されない
WTF-8 ではサロゲートの片側だけ許されるがそのせいで追加の処理が必要
冗長性うんぬんを言い出すのはこの違いが分かってないやつという話題だろ
233デフォルトの名無しさん
2025/01/21(火) 17:51:44.82ID:ARY2cBPO Windowsも対応しているRipGrepの場合、OsStringのまま処理してるけど
ユーザーアプリレベルでWTF-8は必要なのか?
(すぐにpub fn into_string(self) -> Result<String, OsString>してる気がする)
ユーザーアプリレベルでWTF-8は必要なのか?
(すぐにpub fn into_string(self) -> Result<String, OsString>してる気がする)
レスを投稿する
ニュース
- 橋下徹氏 外務省幹部の訪中受け「口だけ番長」へ痛烈指摘 「喧嘩は日本の完敗…なんとかっこ悪い日本か」 [冬月記者★]
- 【外国人問題】小野田紀美担当相「不法就労や不法滞在は許さない」 [シャチ★]
- 【野球】井端監督 大谷翔平、山本由伸らのWBCへの参加 「1日も早く返事ほしい」「待っててといっても、国内組が遅くなってしまう」★3 [冬月記者★]
- 経団連会長、日中は建設的対話を 経済3団体が高市首相と初会談も日中関係は話題に登らず… [BFU★]
- 中国で「クレしん」公開延期 対日報復、エンタメに波及 [蚤の市★]
- 東京株式市場 インバウンド関連株が下落 中国政府の渡航自粛要請で [バイト歴50年★]
- 有識者「高市総理が発言を撤回したり、辞職するしかないと言っている人は、それで日中関係が今まで通りになると思ってる?」 [834922174]
- 戦争は無くならないし殺人は起きるし女はレイプされるし子供は餓死するし
- なんでみんな陰キャを悪く言いたがるんだ?
- ファミコンで最もクオリティの高いソフトって何だと思う?
- 日経時間外、5万円割れ 垂直落下始まる [402859164]
- 【悲報】男性人気アイドルグループJO1、中国公演中止wwwwwwwwwwwwwwwwwwwwwwwwwww
