G国で絵文字を含む発言があると書き出しに失敗する
2016-05-31 第一報
https://twitter.com/hironytic/status/737418083006971904
該当発言サンプル : G国1401村 プロローグ 14:47 カタリナ
http://www.wolfg.x0.com/index.rb?vid=1401&meslog=000_ready#mes1427867255
XHTML引用 :【 私の羊は良い羊<br />とってもとっても良い羊<br />🐑🐑🐑 】
子羊文字はUnicode6.0で採択。
U+1F411 SHEEP 【🐑】
UTF16BE : 0xd83ddc11
UTF8 : 0xf09f9091
対象コンポーネントの依存パッケージ情報
JinArchiver 1.502.2
https://osdn.jp/projects/jindolf/scm/hg/JinArchiver/commits/dcd771864f015ddec2b3f7b9bf22fa5972349a60
→ JinParser 1.407.2
https://osdn.jp/projects/jindolf/scm/hg/JinParser/commits/64ab4cc24516e9e0cef156c9d6bf2817f51552ab
→→ JinCore 1.206.2
https://osdn.jp/projects/jindolf/scm/hg/JinCore/commits/16693a808f882fc946ca03fd130da8d96d19b150
実行時にのみ XmlSceme 110421版XMLスキーマに依存
https://osdn.jp/projects/jindolf/scm/hg/XmlScheme/commits/72e86cf7efde42c3c151bb366ddaa3a1ac377938
olyutorskii への返信
長期間放置しすぎたため、依存パッケージの版がとてつもなく古い現状を確認。
修正に先立ち、まずは依存パッケージを新しい版に置き換えることが可能なのか平行して調査を行いたい。
XMLスキーマはXMLリダイレクタを使ってアプリ内部リソースに埋め込めるのでは?
Jindolfのフキダシ領域上におけるCopy&Paste機能やその他の文字列処理機能が完全にUCS4対応するまでの間、JinParserでは引き続きサロゲートペア入力を異常系として扱おうと思っています。
JinArchiverでUCS4読みたい人は<rawdata>出力見て復元してくださいと言うことで。
いや、JinParserではサロゲートペアを素通りさせてJindolf側で弾いた方が楽なのかどうか。
XML検証タスクを無理矢理オフにして該当箇所をXML出力した結果
... <talk type="public" avatarId="katharina" xname="mes1427867255" time="14:47:00+09:00" > <li>私の羊は良い羊</li> <li>とってもとっても良い羊</li> <li><rawdata encoding="Shift_JIS" hexBin="d8" >�</rawdata><rawdata encoding="Shift_JIS" hexBin="3d" >�</rawdata><rawdata encoding="Shift_JIS" hexBin="dc" >�</rawdata><rawdata encoding="Shift_JIS" hexBin="11" >�</rawdata>?<rawdata encoding="Shift_JIS" hexBin="d8" >�</rawdata><rawdata encoding="Shift_JIS" hexBin="3d" >�</rawdata><rawdata encoding="Shift_JIS" hexBin="dc" >�</rawdata><rawdata encoding="Shift_JIS" hexBin="11" >�</rawdata>?<rawdata encoding="Shift_JIS" hexBin="d8" >�</rawdata><rawdata encoding="Shift_JIS" hexBin="3d" >�</rawdata><rawdata encoding="Shift_JIS" hexBin="dc" >�</rawdata><rawdata encoding="Shift_JIS" hexBin="11" >�</rawdata>?</li> </talk> ...
仕様差分はBBS主催者URLの変更と初心者村対応ぐらいしかないはずなので、JinParser1.408.4およびJinCore1.206.6に版を上げる予定。
少なくとも JinParser 1.408.4 の ContentBuilderUCS2.java にはサロゲートペア出現時の異常系に障害があることが判明したので、JinParserとJindolfにも更新が入る予定です。
JinParserライブラリの障害としてチケット#36390を発行しました。
JinParser 1.409.2 版ではサロゲートペア出現を弾く機能をオプション動作とした。
よってJinArchiverの出力にサロゲートペアが出現する仕様となった。
G国では<rawdata>タグのencoding属性に”UTF-8”が入るようになった。
JinArchiver 1.503.2 版で期待通りの動作をすることを確認しました! 羊は <rawdata> にはならず、サロゲートペアのまま XML 中に出現するようになりました。
ありがとうございました🐑
例えば、G1401村を出力しようとすると、プロローグ 14:47 のカタリナの絵文字(羊)が原因で次のようにエラーになります。
G国向けに使われる ContentBuilderUCS2 はサロゲートペアをエラー扱いにしますが、その結果、上位サロゲート、下位サロゲートの個別のコードが <rawdata> の内容に使われてしまって、XMLで許可される文字集合にない文字があると認識されるようです。(<rawdata> の encode属性がShift_JIS固定なのもアレですが)
とりあえずの回避として、サロゲートペアをエラー扱いにしないようにしてみると失敗はしなくなりました。(これは強引な修正ですが…)
https://github.com/hironytic/JinArchiver/compare/f8476cc...917db6f
環境: