Ticket #36356

G国で絵文字を含む発言があると書き出しに失敗する

Open Date: 2016-06-02 19:56 Last Update: 2016-07-05 07:29

Reporter:
Owner:
Type:
Status:
Closed
Component:
MileStone:
(None)
Priority:
5 - Medium
Severity:
5 - Medium
Resolution:
Fixed
File:
None

Details

例えば、G1401村を出力しようとすると、プロローグ 14:47 のカタリナの絵文字(羊)が原因で次のようにエラーになります。

$ java -jar jinarchiver-1.502.2.jar -land wolfg -vid 1401 -outdir .
org.xml.sax.SAXParseException; lineNumber: 1678; columnNumber: 221; ドキュメントの要素コンテンツに無効なXML文字(Unicode: 0xdc11)が見つかりました。
  at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:203)
  at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.fatalError(ErrorHandlerWrapper.java:177)
  at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:441)
  at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:368)
  at com.sun.org.apache.xerces.internal.impl.XMLScanner.reportFatalError(XMLScanner.java:1436)
  at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2927)
  at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:606)
  at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:117)
  at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:510)
  at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:848)
  at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:777)
  at com.sun.org.apache.xerces.internal.jaxp.validation.StreamValidatorHelper.validate(StreamValidatorHelper.java:155)
  at com.sun.org.apache.xerces.internal.jaxp.validation.ValidatorImpl.validate(ValidatorImpl.java:116)
  at javax.xml.validation.Validator.validate(Validator.java:124)
  at jp.sourceforge.jindolf.archiver.ValidateTask.run(ValidateTask.java:52)
  at java.lang.Thread.run(Thread.java:745)
XML検証に失敗しました。

G国向けに使われる ContentBuilderUCS2 はサロゲートペアをエラー扱いにしますが、その結果、上位サロゲート、下位サロゲートの個別のコードが <rawdata> の内容に使われてしまって、XMLで許可される文字集合にない文字があると認識されるようです。(<rawdata> の encode属性がShift_JIS固定なのもアレですが)

とりあえずの回避として、サロゲートペアをエラー扱いにしないようにしてみると失敗はしなくなりました。(これは強引な修正ですが…)
https://github.com/hironytic/JinArchiver/compare/f8476cc...917db6f

環境:

  • Mac OS X 10.11.4
  • JRE 1.8.0_25

Ticket History (3/12 Histories)

2016-06-02 19:56 Updated by: hironytic
  • New Ticket "G国で絵文字を含む発言があると書き出しに失敗する" created
2016-06-06 02:15 Updated by: olyutorskii
  • Owner Update from (None) to olyutorskii
  • Resolution Update from None to Accepted
2016-06-06 22:54 Updated by: olyutorskii
Comment

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

2016-06-06 23:20 Updated by: olyutorskii
Comment

olyutorskii への返信

長期間放置しすぎたため、依存パッケージの版がとてつもなく古い現状を確認。

修正に先立ち、まずは依存パッケージを新しい版に置き換えることが可能なのか平行して調査を行いたい。

XMLスキーマはXMLリダイレクタを使ってアプリ内部リソースに埋め込めるのでは?

2016-06-06 23:48 Updated by: olyutorskii
Comment

Jindolfのフキダシ領域上におけるCopy&Paste機能やその他の文字列処理機能が完全にUCS4対応するまでの間、JinParserでは引き続きサロゲートペア入力を異常系として扱おうと思っています。

JinArchiverでUCS4読みたい人は<rawdata>出力見て復元してくださいと言うことで。

いや、JinParserではサロゲートペアを素通りさせてJindolf側で弾いた方が楽なのかどうか。

2016-06-07 01:03 Updated by: olyutorskii
Comment

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>
...
2016-06-09 21:09 Updated by: olyutorskii
Comment

仕様差分はBBS主催者URLの変更と初心者村対応ぐらいしかないはずなので、JinParser1.408.4およびJinCore1.206.6に版を上げる予定。

2016-06-13 22:45 Updated by: olyutorskii
Comment

少なくとも JinParser 1.408.4 の ContentBuilderUCS2.java にはサロゲートペア出現時の異常系に障害があることが判明したので、JinParserとJindolfにも更新が入る予定です。

2016-06-15 19:28 Updated by: olyutorskii
Comment

JinParserライブラリの障害としてチケット#36390を発行しました。

2016-07-05 01:00 Updated by: olyutorskii
  • Ticket Close date is changed to 2016-07-05 01:00
  • Status Update from Open to Closed
  • Resolution Update from Accepted to Fixed
Comment

JinParser 1.409.2 版ではサロゲートペア出現を弾く機能をオプション動作とした。

よってJinArchiverの出力にサロゲートペアが出現する仕様となった。

G国では<rawdata>タグのencoding属性に”UTF-8”が入るようになった。

2016-07-05 07:29 Updated by: hironytic
Comment

JinArchiver 1.503.2 版で期待通りの動作をすることを確認しました! 羊は <rawdata> にはならず、サロゲートペアのまま XML 中に出現するようになりました。

ありがとうございました🐑

Attachment File List

No attachments

Edit

Please login to add comment to this ticket » Login