| <html> |
| <head> |
| <script src="../../resources/js-test-pre.js"></script> |
| <script src="resources/char-decoding-utils.js"></script> |
| </head> |
| <body> |
| <script> |
| |
| description("This tests decoding characters in various character sets."); |
| |
| testDecode('UTF-8', '%E2%88%9A', 'U+221A'); |
| |
| // <http://bugs.webkit.org/show_bug.cgi?id=17014> EUC-CN code A3A0 is mapped to U+E5E5 instead of U+3000 |
| testDecode('gb2312', '%A3%A0', 'U+3000'); |
| testDecode('gb_2312-80', '%A3%A0', 'U+3000'); |
| testDecode('chinese', '%A3%A0', 'U+3000'); |
| testDecode('gbk', '%A3%A0', 'U+3000'); |
| testDecode('gb18030', '%A3%A0', 'U+3000'); |
| testDecode('EUC-CN', '%A3%A0', 'U+3000'); |
| |
| // Test Shift_JIS aliases. |
| testDecode('Shift_JIS', '%82%d0', 'U+3072'); |
| testDecode('shift-jis', '%82%d0', 'U+3072'); |
| |
| // Test that all Korean encodings of EUC-KR family are treated as windows-949. |
| var korean = { |
| encodings: ['korean', 'EUC-KR', 'windows-949', 'x-windows-949', 'x-uhc', |
| 'iso-ir-149', 'KS_C_5601-1987', 'KS_C_5601-1989', |
| 'KSC5601', 'KSC_5601'], |
| encoded: ['%A2%E6', '%A1%A4', '%A1%A9', '%A1%AA', '%A1%AD', '%A2%A6', |
| '%A2%C1', '%1A', '%1C', '%8F%A1', '%B4%D3', '%A2%41'], |
| unicode: ['U+20AC', 'U+00B7', 'U+00AD', 'U+2015', 'U+223C', 'U+FF5E', |
| 'U+2299', 'U+001A', 'U+001C', 'U+B8EA', 'U+B2D2', 'U+C910'] |
| }; |
| |
| batchTestDecode(korean); |
| |
| // Test that ISO-8859-9 (Turkish) is upgraded to windows-1254 with Euro symbol. |
| var turkish = { |
| encodings: ['iso-8859-9', 'latin5', 'windows-1254'], |
| encoded: ['%80', '%9F', '%FD'], |
| unicode: ['U+20AC', 'U+0178', 'U+0131'] |
| }; |
| |
| batchTestDecode(turkish); |
| |
| // FIXME: Have to add tests for Euro and a few new characters added to ISO-8859-x |
| // that are NOT subsets of the corresponding Windows codepages. For instance, |
| // ISO-8859-7:2003 has Euro at 0xA4 and a couple of other new characters. |
| // ICU 3.8.x or later has them. Perhaps, we need to have a separate test that |
| // can be enabled only with modern ICU. |
| |
| // Baltic encodings fine points. |
| testDecode('ISO-8859-13', '%A1', 'U+201D'); |
| testDecode('ISO-8859-13', '%A5', 'U+201E'); |
| testDecode('ISO-8859-13', '%B4', 'U+201C'); |
| testDecode('ISO-8859-13', '%FF', 'U+2019'); |
| testDecode('windows-1257', '%80', 'U+20AC'); |
| testDecode('windows-1257', '%B4', 'U+00B4'); |
| testDecode('windows-1257', '%FF', 'U+02D9'); |
| |
| // Greek encodings fine points. |
| testDecode('iso-8859-7', '%A1', 'U+2018'); |
| testDecode('iso-8859-7', '%B5', 'U+0385'); |
| testDecode('iso-8859-7', '%B6', 'U+0386'); |
| testDecode('windows-1253', '%80', 'U+20AC'); |
| testDecode('windows-1253', '%A1', 'U+0385'); |
| testDecode('windows-1253', '%B5', 'U+00B5'); |
| testDecode('windows-1253', '%B6', 'U+00B6'); |
| |
| // KOI-8 variants |
| testDecode('KOI8-R', '%A4', 'U+2553'); |
| testDecode('KOI8-R', '%AD', 'U+255C'); |
| testDecode('KOI8-U', '%A4', 'U+0454'); |
| testDecode('KOI8-U', '%AD', 'U+0491'); |
| |
| // Test that TIS-620 and ISO-8859-11 (Thai) are upgraded to windows-874. |
| // "0xDB => U+F8C1" is a weird PUA mapping that doesn't seem to be of |
| // any use, even on Windows. |
| var thai = { |
| encodings: ['TIS-620', 'ISO-8859-11', 'windows-874', 'dos-874'], |
| encoded: ['%80', '%96', '%A0', '%A1', '%DB'], |
| unicode: ['U+20AC', 'U+2013', 'U+00A0', 'U+0E01', 'U+F8C1'] |
| }; |
| |
| batchTestDecode(thai); |
| |
| // UTF-7 is expressly forbidden, so decoding it should not work correctly. |
| // This attempts to decode '<' as UTF-7 (+AD4) but it ends up being decoded |
| // as a '+AD4'. |
| testDecode('UTF-7', '+AD4', 'U+002B/U+0041/U+0044/U+0034'); |
| testDecode('utf-7', '+AD4', 'U+002B/U+0041/U+0044/U+0034'); |
| |
| // UTF-16LE and variants. |
| testDecode('UTF-16LE', '%69%D8%D6%DE', 'U+D869/U+DED6'); |
| testDecode('unicodeFEFF', '%69%D8%D6%DE', 'U+D869/U+DED6'); |
| // According to HTML5 and for IE compatibility, UTF-16 is treated as little endian. The following tests fail as of Firefox 3.6.13. |
| testDecode('UTF-16', '%69%D8%D6%DE', 'U+D869/U+DED6'); |
| testDecode('ISO-10646-UCS-2', '%69%D8%D6%DE', 'U+D869/U+DED6'); |
| testDecode('UCS-2', '%69%D8%D6%DE', 'U+D869/U+DED6'); |
| testDecode('Unicode', '%69%D8%D6%DE', 'U+D869/U+DED6'); |
| testDecode('csUnicode', '%69%D8%D6%DE', 'U+D869/U+DED6'); |
| |
| // UTF-16BE and variants. |
| testDecode('UTF-16BE', '%D8%69%DE%D6', 'U+D869/U+DED6'); |
| testDecode('unicodeFFFE', '%D8%69%DE%D6', 'U+D869/U+DED6'); |
| |
| // Replacement encodings should decode as replacement (U+FFFD) then EOF |
| testDecode("csiso2022kr", "%41%42%43%61%62%63%31%32%33%A0", "U+FFFD"); |
| testDecode("hz-gb-2312", "%41%42%43%61%62%63%31%32%33%A0", "U+FFFD"); |
| testDecode("iso-2022-cn", "%41%42%43%61%62%63%31%32%33%A0", "U+FFFD"); |
| testDecode("iso-2022-cn-ext", "%41%42%43%61%62%63%31%32%33%A0", "U+FFFD"); |
| testDecode("iso-2022-kr", "%41%42%43%61%62%63%31%32%33%A0", "U+FFFD"); |
| |
| </script> |
| <script src="../../resources/js-test-post.js"></script> |
| </body> |
| </html> |