文字コード総合スレ part15 (470レス)
上下前次1-新
181: 01/18(土)10:44 ID:CaguG0TX(3/7) AAS
 >>180 
 最初っからWTF-8って言ってるじゃん 
182: 01/18(土)10:49 ID:CaguG0TX(4/7) AAS
 Windowsのファイルシステムでは文字コードとしては不正なバイト列がファイル名として存在できる 
 それを8バイト文字列で無理やり扱うためRustではWTF-8という本来エラーになる表現も許容した規格違反UTF-8を使っている 
 OK? 
183: 01/18(土)11:09 ID:ryxfYm1H(3/5) AAS
 だから WTF-8 は UTF-8 とは違う 
 別物なんだから混同しなければ脆弱性にはならない 
184: 01/18(土)11:15 ID:CaguG0TX(5/7) AAS
 Rustではファイル名をWTF-8で扱うけどWTF-8で文字列処理すると危なくね?ってそれだけの話だよ 
 UTF-8の話と混同して絡んできたのはあんたじゃね 
185: 01/18(土)11:27 ID:7Jaib8zo(1) AAS
 m1Hは馬鹿ちんちん 
186: 01/18(土)11:33 ID:ryxfYm1H(4/5) AAS
 WTF-8 の文字列を UTF-8 の比較関数とかで処理しようとしてもうまくいかない → 当たり前 
 これは脆弱性ではないし、冗長性も関係ない 
 ここまでは理解できてるんだよな? 
  
 WTF-8 が別規格なんだからそれ専用の処理コードが必要ってだけだろ 
 UTF-8ではないので混同するなって話 
187: 01/18(土)11:36 ID:CaguG0TX(6/7) AAS
 もう自分が何書いてるかもわかってなさそう 
 もう一度読んで? 
188(1): 01/18(土)11:44 ID:rGNNXTeE(1/2) AAS
 横通ります 
  
 Rustではディレクトリを開いてスキャンしたら各ファイル名はWTF-8とやらのスライスなのか? 
189(1): 01/18(土)11:46 ID:rGNNXTeE(2/2) AAS
 それとLinuxのファイルシステム自体もUTF-8文字コードを外れてもOKだから、Windowsに限った話ではないかと 
 LTF-8もあるのか? 
190(2): 01/18(土)12:03 ID:CaguG0TX(7/7) AAS
 >>188-189 
 型としてはOsStringとしてラップされてて、中身を取り出したらWindowsではWTF-8 
 不正な文字コードが入りうるのはどのOSでも同じだけどバイト列そのままな他OSと異なりWindowsだとUTF-16との変換も挟まって危なそうだなあって 
  
 (ちなmacOSやあとBSDのzfsなんかだと不正な文字コードは最初から入らないらしい?) 
191: 188-189 01/18(土)12:30 ID:ZXpOcGU5(1) AAS
 >>190 
 なるほどね納得 
  
 不正な文字コードに遭遇したら処理を進めないで即座にエラーにするが良さそう 
  
 問題は処理系がちゃんと不正な文字コードを感知するかどうかだけど、 
 WindowsでA系APIを使っていれば(RawワイドストリングのUTF-16解釈が試みられて) 
 不正なパラメータエラーとかで(ディレクトリスキャン時などの)早期に発見できそうな気がする 
192: 01/18(土)12:32 ID:ryxfYm1H(5/5) AAS
 なんだろうな? 
 UTF-8: 片サロゲートも両サロゲートも不可 
 WTF-8: 片サロゲートのみ可、両サロゲートは不可 
 CESU-8: サロゲート展開必須 
 という区別がちゃんとついてるんだろうかという疑問、これら混ぜれば冗長だが… 
 単独で冗長と言われても具体性がない 
193: 01/20(月)21:45 ID:fFffNKjx(1/9) AAS
 勘違いしてる人がいるため正しい情報 
  
 まずRustの文字列つまりstr型とString型はvalidなUTF-8のみであることが必ず保証されている 
 そこには当然サロゲートもなければinvalidなUTF-8もないため問題は一切起きない 
 そこにWTF-8など他のものが混ざることも絶対にない 
 つまりどんな文字列操作をしても冗長表現のない 
 validなUTF-8となる安全が保証されている 
  
 つづく 
194: 01/20(月)21:46 ID:fFffNKjx(2/9) AAS
 次に言語とは関係ない話 
 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(1): 01/20(月)21:47 ID:fFffNKjx(3/9) AAS
 UTF-16⇔UTF-8は常に可逆に変換できる 
 前述のWTF-16に対しても同様に可逆となるものとしてWTF-8が考えられる 
 つまりWTF-16⇔WTF-8は常に可逆に変換できる 
 前述のWTF-16⊃UTF-16と同様に 
 WTF-8⊃UTF-8となる 
 このWTF-8はあくまでもWTF-16との可逆を保証するための内部表現であり外で使われることはない 
  
 つづく 
196: 01/20(月)21:48 ID:fFffNKjx(4/9) AAS
 このWTF-8には以下の利点がある 
 ・WTF-16(=任意の16bit列)と可逆に1対1に変換できる 
 ・元のWTF-16がUTF-16のみの場合は対応するWTF-8はUTF-8のみとなる 
 ・特に元がアスキー文字のみならば対応するWTF-8は7bitアスキー文字となる 
  
 集合関係はWTF-8⊃UTF-8⊃7bitアスキー文字となる 
 つまり内部表現として非常に使い勝手が良いものとなっている 
  
 つづく 
197: 01/20(月)21:49 ID:fFffNKjx(5/9) AAS
 そしてようやく再びRustの話 
 Rustでは言語の外の世界とをつなぐFFI (Foreign Function Initerface)の一つとして 
 OS環境依存の文字列型としてOsString型とOsStr型がある 
 これはvalidなUTF-8文字列型であるString型とstr型にそれぞれ対応する 
 集合的にはOsString⊃StringとOsStr⊃strとなりinvalidなUTF-8を含む分だけ大きな集合を表す 
 Windows環境ではこの内部表現として前述のWTF-8が使われている 
  
 つづく 
198(1): 01/20(月)21:50 ID:fFffNKjx(6/9) AAS
 >>177 >>190 
 WTF-8を新たに作り出すにはvalidなUTF-8から作るか 
 あるいは16bit列から作るかのどちらかしか手段がない 
 つまり必ずWTF-16(=任意の16bit列)⇔WTF-8は1対1に対応する 
 したがってあなたが主張する 
 「別の冗長表現」は生じることはなく危険なことは絶対に起こらない 
199: 01/20(月)22:03 ID:SJIxPBxD(1) AAS
 Rustスレから出てこないで欲しいなあ 
200: 01/20(月)22:15 ID:fw0guZsp(1/5) AAS
 >>198 
 普通に結合で新しくOsStringを作ってる例がありますやん 
 外部リンク[html]:doc.rust-lang.org 
201: 01/20(月)22:20 ID:SnLzVhb4(1/2) AAS
 utf8とutf8を結合しても必ずutf8となるように 
 wtf8とwtf8を結合しても必ずwtf8だね 
 何を問題視しているのかな 
202(1): 01/20(月)22:26 ID:fw0guZsp(2/5) AAS
 何度も書いてるじゃないですか 
 サロゲートの片方だけなWTF-8同士を結合するとサロゲートペアが揃ってしまって本来あるべき形の別表現となるでしょ 
 その状態で比較等をすると狂いが生じる話 
203: 01/20(月)22:44 ID:SnLzVhb4(2/2) AAS
 >>202 
 wtf16の1文字(16bit値)とwtf8の1文字が可逆対応だよ 
 それぞれ結合してN文字同士になっても可逆対応だよ 
 別表現なし 
 何を問題視しているのかな 
204(3): 01/20(月)22:51 ID:uZ5HVjRv(1/3) AAS
 WTF-8 どうしを結合するときは終端処理をしてサロゲートの変換をしないといけない 
 UTF-8  のように単純に結合することできない 
 両サロゲートが含まれてるものはWTF-8ではない 
205(1): 01/20(月)23:00 ID:fw0guZsp(3/5) AAS
 >>204 
 そうそうそれそれ。ようやく話が通じそうな人が来てくれた 
 で、現実には?と 
206(2): 01/20(月)23:18 ID:uZ5HVjRv(2/3) AAS
 >>205 
 片サロゲートはユニコード的には文字コードではないので片サロゲートの結合をどう処理するかは実装依存 
 捨てる、未定義文字に置き変える、文字だったことにしてUTF-8変換する、なんかのセパレータを挟むとかできるかもしれない 
 でも一般的と思われるのは結合処理自体をエラーで失敗させる 
 WTF-8 にも UTF-8 にも冗長性はない、WTF-8 を UTF-8 と同じように使ってはいけないだけ、両者は別物 
207(1): 01/20(月)23:19 ID:fFffNKjx(7/9) AAS
 >>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に可逆が保証される 
 別の冗長表現は生じない 
208(1): 01/20(月)23:26 ID:uZ5HVjRv(3/3) AAS
 >>206 
 一応補足しておくと、エラーなどの処理するのは結合時点でなくて、それを何か使おうとしたり、他の文字コードに変換しようとした時点とすることもできる 
 Invalid な WTF-8 のチェックをどの時点でするかだけの問題 
209(3): 01/20(月)23:27 ID:fw0guZsp(4/5) AAS
 >>206 
 OSがファイル名として扱えるバイナリ列を作れないのはむしろそちらのほうが問題になるので 
 失敗させるのはナシでは 
  
 >>206-207 
 で、今ソースを追いかけていてpushに関しては 
 外部リンク[html]:stdrs.dev 
 で>>204の処理がなされてるのを確認しました 
 つまりpushに関しては俺の杞憂でした(もちろん他の処理は別) 
210: 01/20(月)23:35 ID:fw0guZsp(5/5) AAS
 >>208 
 他言語のStringBuilder等ならそうだけど 
 OsStringには直接の比較関数等もあるので結合時点以外に選択肢は無いと思う 
上下前次1-新書関写板覧索設栞歴
あと 260 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ
ぬこの手 ぬこTOP 0.011s