LibTextCodec: Update GB18030 for GB18030-2022 and import WPT tests

Update the GB18030 encoder to spec-compliantly handle old PUA code
points via a direct byte lookup table (spec step 5). Bake the 18
GB18030-2022 code point updates into indexes.json and remove the
now-unnecessary patching logic from the code generator. Drop the
redundant hardcoded switch in the decoder's range function, as the
range formula already produces correct values.

Import WPT tests for gb18030 decoder, gb18030 encoder, and gbk
encoder, and register the worker variant in TestConfig.ini.
This commit is contained in:
Martin Chrástek 2026-05-08 17:46:24 +02:00 committed by Shannon Booth
parent 6afe179e5a
commit c382e5d254
16 changed files with 1478 additions and 82 deletions

View file

@ -850,49 +850,6 @@ static Optional<u32> index_gb18030_ranges_code_point(u32 pointer)
if (pointer == 7457)
return 0xE7C7;
// FIXME: Encoding specification is not updated to GB-18030-2022 yet (https://github.com/whatwg/encoding/issues/312)
// NOTE: This matches https://commits.webkit.org/266173@main
switch (pointer) {
case 19057:
return 0xE81E; // 82 35 90 37
case 19058:
return 0xE826; // 82 35 90 38
case 19059:
return 0xE82B; // 82 35 90 39
case 19060:
return 0xE82C; // 82 35 91 30
case 19061:
return 0xE832; // 82 35 91 31
case 19062:
return 0xE843; // 82 35 91 32
case 19063:
return 0xE854; // 82 35 91 33
case 19064:
return 0xE864; // 82 35 91 34
case 39076:
return 0xE78D; // 84 31 82 36
case 39077:
return 0xE78F; // 84 31 82 37
case 39078:
return 0xE78E; // 84 31 82 38
case 39079:
return 0xE790; // 84 31 82 39
case 39080:
return 0xE791; // 84 31 83 30
case 39081:
return 0xE792; // 84 31 83 31
case 39082:
return 0xE793; // 84 31 83 32
case 39083:
return 0xE794; // 84 31 83 33
case 39084:
return 0xE795; // 84 31 83 34
case 39085:
return 0xE796; // 84 31 83 35
default:
break;
}
// 3. Let offset be the last pointer in index gb18030 ranges that is less than or equal to pointer and let code point offset be its corresponding code point.
size_t last_index;
binary_search(s_gb18030_ranges, pointer, &last_index, [](auto const pointer, auto const& entry) {

View file

@ -578,10 +578,106 @@ ErrorOr<void> GB18030Encoder::process(Utf8View input, Function<ErrorOr<void>(u8)
continue;
}
// 5. Let pointer be the index pointer for code point in index gb18030.
// 5. If there is a row in the table below whose first column is codePoint, then return the two bytes on the same row listed in the second column:
// Code point Bytes
// U+E78D 0xA6 0xD9
// U+E78E 0xA6 0xDA
// U+E78F 0xA6 0xDB
// U+E790 0xA6 0xDC
// U+E791 0xA6 0xDD
// U+E792 0xA6 0xDE
// U+E793 0xA6 0xDF
// U+E794 0xA6 0xEC
// U+E795 0xA6 0xED
// U+E796 0xA6 0xF3
// U+E81E 0xFE 0x59
// U+E826 0xFE 0x61
// U+E82B 0xFE 0x66
// U+E82C 0xFE 0x67
// U+E832 0xFE 0x6D
// U+E843 0xFE 0x7E
// U+E854 0xFE 0x90
// U+E864 0xFE 0xA0
switch (item) {
case 0xE78D:
TRY(on_byte(0xA6));
TRY(on_byte(0xD9));
continue;
case 0xE78E:
TRY(on_byte(0xA6));
TRY(on_byte(0xDA));
continue;
case 0xE78F:
TRY(on_byte(0xA6));
TRY(on_byte(0xDB));
continue;
case 0xE790:
TRY(on_byte(0xA6));
TRY(on_byte(0xDC));
continue;
case 0xE791:
TRY(on_byte(0xA6));
TRY(on_byte(0xDD));
continue;
case 0xE792:
TRY(on_byte(0xA6));
TRY(on_byte(0xDE));
continue;
case 0xE793:
TRY(on_byte(0xA6));
TRY(on_byte(0xDF));
continue;
case 0xE794:
TRY(on_byte(0xA6));
TRY(on_byte(0xEC));
continue;
case 0xE795:
TRY(on_byte(0xA6));
TRY(on_byte(0xED));
continue;
case 0xE796:
TRY(on_byte(0xA6));
TRY(on_byte(0xF3));
continue;
case 0xE81E:
TRY(on_byte(0xFE));
TRY(on_byte(0x59));
continue;
case 0xE826:
TRY(on_byte(0xFE));
TRY(on_byte(0x61));
continue;
case 0xE82B:
TRY(on_byte(0xFE));
TRY(on_byte(0x66));
continue;
case 0xE82C:
TRY(on_byte(0xFE));
TRY(on_byte(0x67));
continue;
case 0xE832:
TRY(on_byte(0xFE));
TRY(on_byte(0x6D));
continue;
case 0xE843:
TRY(on_byte(0xFE));
TRY(on_byte(0x7E));
continue;
case 0xE854:
TRY(on_byte(0xFE));
TRY(on_byte(0x90));
continue;
case 0xE864:
TRY(on_byte(0xFE));
TRY(on_byte(0xA0));
continue;
}
// 6. Let pointer be the index pointer for code point in index gb18030.
auto pointer = code_point_gb18030_index(item);
// 6. If pointer is non-null, then:
// 7. If pointer is non-null, then:
if (pointer.has_value()) {
// 1. Let lead be pointer / 190 + 0x81.
auto lead = *pointer / 190 + 0x81;
@ -600,34 +696,34 @@ ErrorOr<void> GB18030Encoder::process(Utf8View input, Function<ErrorOr<void>(u8)
continue;
}
// 7. If is GBK is true, return error with code point.
// 8. If is GBK is true, return error with code point.
if (gbk) {
TRY(on_error(item));
continue;
}
// 8. Set pointer to the index gb18030 ranges pointer for code point.
// 9. Set pointer to the index gb18030 ranges pointer for code point.
pointer = index_gb18030_ranges_pointer(item);
// 9. Let byte1 be pointer / (10 × 126 × 10).
// 10. Let byte1 be pointer / (10 × 126 × 10).
auto byte1 = *pointer / (10 * 126 * 10);
// 10. Set pointer to pointer % (10 × 126 × 10).
// 11. Set pointer to pointer % (10 × 126 × 10).
pointer = *pointer % (10 * 126 * 10);
// 11. Let byte2 be pointer / (10 × 126).
// 12. Let byte2 be pointer / (10 × 126).
auto byte2 = *pointer / (10 * 126);
// 12. Set pointer to pointer % (10 × 126).
// 13. Set pointer to pointer % (10 × 126).
pointer = *pointer % (10 * 126);
// 13. Let byte3 be pointer / 10.
// 14. Let byte3 be pointer / 10.
auto byte3 = *pointer / 10;
// 14. Let byte4 be pointer % 10.
// 15. Let byte4 be pointer % 10.
auto byte4 = *pointer % 10;
// 15. Return four bytes whose values are byte1 + 0x81, byte2 + 0x30, byte3 + 0x81, byte4 + 0x30.
// 16. Return four bytes whose values are byte1 + 0x81, byte2 + 0x30, byte3 + 0x81, byte4 + 0x30.
TRY(on_byte(static_cast<u8>(byte1 + 0x81)));
TRY(on_byte(static_cast<u8>(byte2 + 0x30)));
TRY(on_byte(static_cast<u8>(byte3 + 0x81)));

File diff suppressed because one or more lines are too long

View file

@ -234,33 +234,6 @@ def main():
gb18030_table = prepare_table(data["gb18030"], GenerateAccessor.YES)
# FIXME: Update JSON to match GB-18030-2022 Encoding specification (https://github.com/whatwg/encoding/issues/312)
# NOTE: See https://commits.webkit.org/264918@main
gb18030_updates = {
7182: 0xFE10,
7183: 0xFE12,
7184: 0xFE11,
7185: 0xFE13,
7186: 0xFE14,
7187: 0xFE15,
7188: 0xFE16,
7201: 0xFE17,
7202: 0xFE18,
7208: 0xFE19,
23775: 0x9FB4,
23783: 0x9FB5,
23788: 0x9FB6,
23789: 0x9FB7,
23795: 0x9FB8,
23812: 0x9FB9,
23829: 0x9FBA,
23845: 0x9FBB,
}
for index, value in gb18030_updates.items():
if index < len(gb18030_table.code_points):
gb18030_table.code_points[index] = value
tables = LookupTables(
gb18030_ranges=data["gb18030-ranges"],
indexes={

View file

@ -143,6 +143,7 @@ Text/input/wpt-import/workers/nested_worker_close_self.worker.html
Text/input/wpt-import/workers/nested_worker_importScripts.worker.html
Text/input/wpt-import/workers/nested_worker_sync_xhr.worker.html
Text/input/wpt-import/workers/nested_worker_terminate_from_document.html
Text/input/wpt-import/encoding/legacy-mb-schinese/gb18030/gb18030-decoder.any.worker.html
Text/input/wpt-import/WebCryptoAPI/historical.any.worker.html
; CORS fetch failures.

View file

@ -0,0 +1,280 @@
Harness status: OK
Found 275 tests
275 Pass
Pass gb18030 decoder: ASCII
Pass gb18030 decoder: euro
Pass gb18030 decoder: initial byte out of accepted ranges
Pass gb18030 decoder: end of queue, gb18030 first not 0
Pass gb18030 decoder: two bytes 0x81 0x28
Pass gb18030 decoder: two bytes 0x81 0x40
Pass gb18030 decoder: two bytes 0x81 0x7e
Pass gb18030 decoder: two bytes 0x81 0x7f
Pass gb18030 decoder: two bytes 0x81 0x80
Pass gb18030 decoder: two bytes 0x81 0xFE
Pass gb18030 decoder: two bytes 0x81 0xFF
Pass gb18030 decoder: two bytes 0xFE 0x40
Pass gb18030 decoder: two bytes 0xFE 0xFE
Pass gb18030 decoder: two bytes 0xFE 0xFF
Pass gb18030 decoder: two bytes 0x81 0x30
Pass gb18030 decoder: three bytes 0x81 0x30 0xFE
Pass gb18030 decoder: three bytes 0x81 0x30 0xFF
Pass gb18030 decoder: four bytes 0x81 0x30 0xFE 0x29
Pass gb18030 decoder: four bytes 0xFE 0x39 0xFE 0x39
Pass gb18030 decoder: pointer 7458
Pass gb18030 decoder: pointer 7457
Pass gb18030 decoder: pointer 7459
Pass gb18030 decoder: pointer 39419
Pass gb18030 decoder: pointer 39420
Pass gb18030 decoder: pointer 189999
Pass gb18030 decoder: pointer 189000
Pass gb18030 decoder: pointer 1237575
Pass gb18030 decoder: pointer 1237576
Pass gb18030 decoder: legacy ICU special case 1
Pass gb18030 decoder: legacy ICU special case 2
Pass gb18030 decoder: legacy ICU special case 3
Pass gb18030 decoder: undefined
Pass gb18030 decoder: GB18030-2022 1
Pass gb18030 decoder: GB18030-2022 2
Pass gb18030 decoder: GB18030-2022 3
Pass gb18030 decoder: GB18030-2022 4
Pass gb18030 decoder: GB18030-2022 5
Pass gb18030 decoder: GB18030-2022 6
Pass gb18030 decoder: GB18030-2022 7
Pass gb18030 decoder: GB18030-2022 8
Pass gb18030 decoder: GB18030-2022 9
Pass gb18030 decoder: GB18030-2022 10
Pass gb18030 decoder: GB18030-2022 11
Pass gb18030 decoder: GB18030-2022 12
Pass gb18030 decoder: GB18030-2022 13
Pass gb18030 decoder: GB18030-2022 14
Pass gb18030 decoder: GB18030-2022 15
Pass gb18030 decoder: GB18030-2022 16
Pass gb18030 decoder: GB18030-2022 17
Pass gb18030 decoder: GB18030-2022 18
Pass gb18030 decoder: GB18030-2022 19
Pass gb18030 decoder: GB18030-2022 20
Pass gb18030 decoder: GB18030-2022 21
Pass gb18030 decoder: GB18030-2022 22
Pass gb18030 decoder: GB18030-2022 23
Pass gb18030 decoder: GB18030-2022 24
Pass gb18030 decoder: GB18030-2022 25
Pass gb18030 decoder: GB18030-2022 26
Pass gb18030 decoder: GB18030-2022 27
Pass gb18030 decoder: GB18030-2022 28
Pass gb18030 decoder: GB18030-2022 29
Pass gb18030 decoder: GB18030-2022 30
Pass gb18030 decoder: GB18030-2022 31
Pass gb18030 decoder: GB18030-2022 32
Pass gb18030 decoder: GB18030-2022 33
Pass gb18030 decoder: GB18030-2022 34
Pass gb18030 decoder: GB18030-2022 35
Pass gb18030 decoder: GB18030-2022 36
Pass gb18030 decoder: range 0
Pass gb18030 decoder: range 1
Pass gb18030 decoder: range 2
Pass gb18030 decoder: range 3
Pass gb18030 decoder: range 4
Pass gb18030 decoder: range 5
Pass gb18030 decoder: range 6
Pass gb18030 decoder: range 7
Pass gb18030 decoder: range 8
Pass gb18030 decoder: range 9
Pass gb18030 decoder: range 10
Pass gb18030 decoder: range 11
Pass gb18030 decoder: range 12
Pass gb18030 decoder: range 13
Pass gb18030 decoder: range 14
Pass gb18030 decoder: range 15
Pass gb18030 decoder: range 16
Pass gb18030 decoder: range 17
Pass gb18030 decoder: range 18
Pass gb18030 decoder: range 19
Pass gb18030 decoder: range 20
Pass gb18030 decoder: range 21
Pass gb18030 decoder: range 22
Pass gb18030 decoder: range 23
Pass gb18030 decoder: range 24
Pass gb18030 decoder: range 25
Pass gb18030 decoder: range 26
Pass gb18030 decoder: range 27
Pass gb18030 decoder: range 28
Pass gb18030 decoder: range 29
Pass gb18030 decoder: range 30
Pass gb18030 decoder: range 31
Pass gb18030 decoder: range 32
Pass gb18030 decoder: range 33
Pass gb18030 decoder: range 34
Pass gb18030 decoder: range 35
Pass gb18030 decoder: range 36
Pass gb18030 decoder: range 37
Pass gb18030 decoder: range 38
Pass gb18030 decoder: range 39
Pass gb18030 decoder: range 40
Pass gb18030 decoder: range 41
Pass gb18030 decoder: range 42
Pass gb18030 decoder: range 43
Pass gb18030 decoder: range 44
Pass gb18030 decoder: range 45
Pass gb18030 decoder: range 46
Pass gb18030 decoder: range 47
Pass gb18030 decoder: range 48
Pass gb18030 decoder: range 49
Pass gb18030 decoder: range 50
Pass gb18030 decoder: range 51
Pass gb18030 decoder: range 52
Pass gb18030 decoder: range 53
Pass gb18030 decoder: range 54
Pass gb18030 decoder: range 55
Pass gb18030 decoder: range 56
Pass gb18030 decoder: range 57
Pass gb18030 decoder: range 58
Pass gb18030 decoder: range 59
Pass gb18030 decoder: range 60
Pass gb18030 decoder: range 61
Pass gb18030 decoder: range 62
Pass gb18030 decoder: range 63
Pass gb18030 decoder: range 64
Pass gb18030 decoder: range 65
Pass gb18030 decoder: range 66
Pass gb18030 decoder: range 67
Pass gb18030 decoder: range 68
Pass gb18030 decoder: range 69
Pass gb18030 decoder: range 70
Pass gb18030 decoder: range 71
Pass gb18030 decoder: range 72
Pass gb18030 decoder: range 73
Pass gb18030 decoder: range 74
Pass gb18030 decoder: range 75
Pass gb18030 decoder: range 76
Pass gb18030 decoder: range 77
Pass gb18030 decoder: range 78
Pass gb18030 decoder: range 79
Pass gb18030 decoder: range 80
Pass gb18030 decoder: range 81
Pass gb18030 decoder: range 82
Pass gb18030 decoder: range 83
Pass gb18030 decoder: range 84
Pass gb18030 decoder: range 85
Pass gb18030 decoder: range 86
Pass gb18030 decoder: range 87
Pass gb18030 decoder: range 88
Pass gb18030 decoder: range 89
Pass gb18030 decoder: range 90
Pass gb18030 decoder: range 91
Pass gb18030 decoder: range 92
Pass gb18030 decoder: range 93
Pass gb18030 decoder: range 94
Pass gb18030 decoder: range 95
Pass gb18030 decoder: range 96
Pass gb18030 decoder: range 97
Pass gb18030 decoder: range 98
Pass gb18030 decoder: range 99
Pass gb18030 decoder: range 100
Pass gb18030 decoder: range 101
Pass gb18030 decoder: range 102
Pass gb18030 decoder: range 103
Pass gb18030 decoder: range 104
Pass gb18030 decoder: range 105
Pass gb18030 decoder: range 106
Pass gb18030 decoder: range 107
Pass gb18030 decoder: range 108
Pass gb18030 decoder: range 109
Pass gb18030 decoder: range 110
Pass gb18030 decoder: range 111
Pass gb18030 decoder: range 112
Pass gb18030 decoder: range 113
Pass gb18030 decoder: range 114
Pass gb18030 decoder: range 115
Pass gb18030 decoder: range 116
Pass gb18030 decoder: range 117
Pass gb18030 decoder: range 118
Pass gb18030 decoder: range 119
Pass gb18030 decoder: range 120
Pass gb18030 decoder: range 121
Pass gb18030 decoder: range 122
Pass gb18030 decoder: range 123
Pass gb18030 decoder: range 124
Pass gb18030 decoder: range 125
Pass gb18030 decoder: range 126
Pass gb18030 decoder: range 127
Pass gb18030 decoder: range 128
Pass gb18030 decoder: range 129
Pass gb18030 decoder: range 130
Pass gb18030 decoder: range 131
Pass gb18030 decoder: range 132
Pass gb18030 decoder: range 133
Pass gb18030 decoder: range 134
Pass gb18030 decoder: range 135
Pass gb18030 decoder: range 136
Pass gb18030 decoder: range 137
Pass gb18030 decoder: range 138
Pass gb18030 decoder: range 139
Pass gb18030 decoder: range 140
Pass gb18030 decoder: range 141
Pass gb18030 decoder: range 142
Pass gb18030 decoder: range 143
Pass gb18030 decoder: range 144
Pass gb18030 decoder: range 145
Pass gb18030 decoder: range 146
Pass gb18030 decoder: range 147
Pass gb18030 decoder: range 148
Pass gb18030 decoder: range 149
Pass gb18030 decoder: range 150
Pass gb18030 decoder: range 151
Pass gb18030 decoder: range 152
Pass gb18030 decoder: range 153
Pass gb18030 decoder: range 154
Pass gb18030 decoder: range 155
Pass gb18030 decoder: range 156
Pass gb18030 decoder: range 157
Pass gb18030 decoder: range 158
Pass gb18030 decoder: range 159
Pass gb18030 decoder: range 160
Pass gb18030 decoder: range 161
Pass gb18030 decoder: range 162
Pass gb18030 decoder: range 163
Pass gb18030 decoder: range 164
Pass gb18030 decoder: range 165
Pass gb18030 decoder: range 166
Pass gb18030 decoder: range 167
Pass gb18030 decoder: range 168
Pass gb18030 decoder: range 169
Pass gb18030 decoder: range 170
Pass gb18030 decoder: range 171
Pass gb18030 decoder: range 172
Pass gb18030 decoder: range 173
Pass gb18030 decoder: range 174
Pass gb18030 decoder: range 175
Pass gb18030 decoder: range 176
Pass gb18030 decoder: range 177
Pass gb18030 decoder: range 178
Pass gb18030 decoder: range 179
Pass gb18030 decoder: range 180
Pass gb18030 decoder: range 181
Pass gb18030 decoder: range 182
Pass gb18030 decoder: range 183
Pass gb18030 decoder: range 184
Pass gb18030 decoder: range 185
Pass gb18030 decoder: range 186
Pass gb18030 decoder: range 187
Pass gb18030 decoder: range 188
Pass gb18030 decoder: range 189
Pass gb18030 decoder: range 190
Pass gb18030 decoder: range 191
Pass gb18030 decoder: range 192
Pass gb18030 decoder: range 193
Pass gb18030 decoder: range 194
Pass gb18030 decoder: range 195
Pass gb18030 decoder: range 196
Pass gb18030 decoder: range 197
Pass gb18030 decoder: range 198
Pass gb18030 decoder: range 199
Pass gb18030 decoder: range 200
Pass gb18030 decoder: range 201
Pass gb18030 decoder: range 202
Pass gb18030 decoder: range 203
Pass gb18030 decoder: range 204
Pass gb18030 decoder: range 205
Pass gb18030 decoder: range 206

View file

@ -0,0 +1,280 @@
Harness status: OK
Found 275 tests
275 Pass
Pass gb18030 decoder: ASCII
Pass gb18030 decoder: euro
Pass gb18030 decoder: initial byte out of accepted ranges
Pass gb18030 decoder: end of queue, gb18030 first not 0
Pass gb18030 decoder: two bytes 0x81 0x28
Pass gb18030 decoder: two bytes 0x81 0x40
Pass gb18030 decoder: two bytes 0x81 0x7e
Pass gb18030 decoder: two bytes 0x81 0x7f
Pass gb18030 decoder: two bytes 0x81 0x80
Pass gb18030 decoder: two bytes 0x81 0xFE
Pass gb18030 decoder: two bytes 0x81 0xFF
Pass gb18030 decoder: two bytes 0xFE 0x40
Pass gb18030 decoder: two bytes 0xFE 0xFE
Pass gb18030 decoder: two bytes 0xFE 0xFF
Pass gb18030 decoder: two bytes 0x81 0x30
Pass gb18030 decoder: three bytes 0x81 0x30 0xFE
Pass gb18030 decoder: three bytes 0x81 0x30 0xFF
Pass gb18030 decoder: four bytes 0x81 0x30 0xFE 0x29
Pass gb18030 decoder: four bytes 0xFE 0x39 0xFE 0x39
Pass gb18030 decoder: pointer 7458
Pass gb18030 decoder: pointer 7457
Pass gb18030 decoder: pointer 7459
Pass gb18030 decoder: pointer 39419
Pass gb18030 decoder: pointer 39420
Pass gb18030 decoder: pointer 189999
Pass gb18030 decoder: pointer 189000
Pass gb18030 decoder: pointer 1237575
Pass gb18030 decoder: pointer 1237576
Pass gb18030 decoder: legacy ICU special case 1
Pass gb18030 decoder: legacy ICU special case 2
Pass gb18030 decoder: legacy ICU special case 3
Pass gb18030 decoder: undefined
Pass gb18030 decoder: GB18030-2022 1
Pass gb18030 decoder: GB18030-2022 2
Pass gb18030 decoder: GB18030-2022 3
Pass gb18030 decoder: GB18030-2022 4
Pass gb18030 decoder: GB18030-2022 5
Pass gb18030 decoder: GB18030-2022 6
Pass gb18030 decoder: GB18030-2022 7
Pass gb18030 decoder: GB18030-2022 8
Pass gb18030 decoder: GB18030-2022 9
Pass gb18030 decoder: GB18030-2022 10
Pass gb18030 decoder: GB18030-2022 11
Pass gb18030 decoder: GB18030-2022 12
Pass gb18030 decoder: GB18030-2022 13
Pass gb18030 decoder: GB18030-2022 14
Pass gb18030 decoder: GB18030-2022 15
Pass gb18030 decoder: GB18030-2022 16
Pass gb18030 decoder: GB18030-2022 17
Pass gb18030 decoder: GB18030-2022 18
Pass gb18030 decoder: GB18030-2022 19
Pass gb18030 decoder: GB18030-2022 20
Pass gb18030 decoder: GB18030-2022 21
Pass gb18030 decoder: GB18030-2022 22
Pass gb18030 decoder: GB18030-2022 23
Pass gb18030 decoder: GB18030-2022 24
Pass gb18030 decoder: GB18030-2022 25
Pass gb18030 decoder: GB18030-2022 26
Pass gb18030 decoder: GB18030-2022 27
Pass gb18030 decoder: GB18030-2022 28
Pass gb18030 decoder: GB18030-2022 29
Pass gb18030 decoder: GB18030-2022 30
Pass gb18030 decoder: GB18030-2022 31
Pass gb18030 decoder: GB18030-2022 32
Pass gb18030 decoder: GB18030-2022 33
Pass gb18030 decoder: GB18030-2022 34
Pass gb18030 decoder: GB18030-2022 35
Pass gb18030 decoder: GB18030-2022 36
Pass gb18030 decoder: range 0
Pass gb18030 decoder: range 1
Pass gb18030 decoder: range 2
Pass gb18030 decoder: range 3
Pass gb18030 decoder: range 4
Pass gb18030 decoder: range 5
Pass gb18030 decoder: range 6
Pass gb18030 decoder: range 7
Pass gb18030 decoder: range 8
Pass gb18030 decoder: range 9
Pass gb18030 decoder: range 10
Pass gb18030 decoder: range 11
Pass gb18030 decoder: range 12
Pass gb18030 decoder: range 13
Pass gb18030 decoder: range 14
Pass gb18030 decoder: range 15
Pass gb18030 decoder: range 16
Pass gb18030 decoder: range 17
Pass gb18030 decoder: range 18
Pass gb18030 decoder: range 19
Pass gb18030 decoder: range 20
Pass gb18030 decoder: range 21
Pass gb18030 decoder: range 22
Pass gb18030 decoder: range 23
Pass gb18030 decoder: range 24
Pass gb18030 decoder: range 25
Pass gb18030 decoder: range 26
Pass gb18030 decoder: range 27
Pass gb18030 decoder: range 28
Pass gb18030 decoder: range 29
Pass gb18030 decoder: range 30
Pass gb18030 decoder: range 31
Pass gb18030 decoder: range 32
Pass gb18030 decoder: range 33
Pass gb18030 decoder: range 34
Pass gb18030 decoder: range 35
Pass gb18030 decoder: range 36
Pass gb18030 decoder: range 37
Pass gb18030 decoder: range 38
Pass gb18030 decoder: range 39
Pass gb18030 decoder: range 40
Pass gb18030 decoder: range 41
Pass gb18030 decoder: range 42
Pass gb18030 decoder: range 43
Pass gb18030 decoder: range 44
Pass gb18030 decoder: range 45
Pass gb18030 decoder: range 46
Pass gb18030 decoder: range 47
Pass gb18030 decoder: range 48
Pass gb18030 decoder: range 49
Pass gb18030 decoder: range 50
Pass gb18030 decoder: range 51
Pass gb18030 decoder: range 52
Pass gb18030 decoder: range 53
Pass gb18030 decoder: range 54
Pass gb18030 decoder: range 55
Pass gb18030 decoder: range 56
Pass gb18030 decoder: range 57
Pass gb18030 decoder: range 58
Pass gb18030 decoder: range 59
Pass gb18030 decoder: range 60
Pass gb18030 decoder: range 61
Pass gb18030 decoder: range 62
Pass gb18030 decoder: range 63
Pass gb18030 decoder: range 64
Pass gb18030 decoder: range 65
Pass gb18030 decoder: range 66
Pass gb18030 decoder: range 67
Pass gb18030 decoder: range 68
Pass gb18030 decoder: range 69
Pass gb18030 decoder: range 70
Pass gb18030 decoder: range 71
Pass gb18030 decoder: range 72
Pass gb18030 decoder: range 73
Pass gb18030 decoder: range 74
Pass gb18030 decoder: range 75
Pass gb18030 decoder: range 76
Pass gb18030 decoder: range 77
Pass gb18030 decoder: range 78
Pass gb18030 decoder: range 79
Pass gb18030 decoder: range 80
Pass gb18030 decoder: range 81
Pass gb18030 decoder: range 82
Pass gb18030 decoder: range 83
Pass gb18030 decoder: range 84
Pass gb18030 decoder: range 85
Pass gb18030 decoder: range 86
Pass gb18030 decoder: range 87
Pass gb18030 decoder: range 88
Pass gb18030 decoder: range 89
Pass gb18030 decoder: range 90
Pass gb18030 decoder: range 91
Pass gb18030 decoder: range 92
Pass gb18030 decoder: range 93
Pass gb18030 decoder: range 94
Pass gb18030 decoder: range 95
Pass gb18030 decoder: range 96
Pass gb18030 decoder: range 97
Pass gb18030 decoder: range 98
Pass gb18030 decoder: range 99
Pass gb18030 decoder: range 100
Pass gb18030 decoder: range 101
Pass gb18030 decoder: range 102
Pass gb18030 decoder: range 103
Pass gb18030 decoder: range 104
Pass gb18030 decoder: range 105
Pass gb18030 decoder: range 106
Pass gb18030 decoder: range 107
Pass gb18030 decoder: range 108
Pass gb18030 decoder: range 109
Pass gb18030 decoder: range 110
Pass gb18030 decoder: range 111
Pass gb18030 decoder: range 112
Pass gb18030 decoder: range 113
Pass gb18030 decoder: range 114
Pass gb18030 decoder: range 115
Pass gb18030 decoder: range 116
Pass gb18030 decoder: range 117
Pass gb18030 decoder: range 118
Pass gb18030 decoder: range 119
Pass gb18030 decoder: range 120
Pass gb18030 decoder: range 121
Pass gb18030 decoder: range 122
Pass gb18030 decoder: range 123
Pass gb18030 decoder: range 124
Pass gb18030 decoder: range 125
Pass gb18030 decoder: range 126
Pass gb18030 decoder: range 127
Pass gb18030 decoder: range 128
Pass gb18030 decoder: range 129
Pass gb18030 decoder: range 130
Pass gb18030 decoder: range 131
Pass gb18030 decoder: range 132
Pass gb18030 decoder: range 133
Pass gb18030 decoder: range 134
Pass gb18030 decoder: range 135
Pass gb18030 decoder: range 136
Pass gb18030 decoder: range 137
Pass gb18030 decoder: range 138
Pass gb18030 decoder: range 139
Pass gb18030 decoder: range 140
Pass gb18030 decoder: range 141
Pass gb18030 decoder: range 142
Pass gb18030 decoder: range 143
Pass gb18030 decoder: range 144
Pass gb18030 decoder: range 145
Pass gb18030 decoder: range 146
Pass gb18030 decoder: range 147
Pass gb18030 decoder: range 148
Pass gb18030 decoder: range 149
Pass gb18030 decoder: range 150
Pass gb18030 decoder: range 151
Pass gb18030 decoder: range 152
Pass gb18030 decoder: range 153
Pass gb18030 decoder: range 154
Pass gb18030 decoder: range 155
Pass gb18030 decoder: range 156
Pass gb18030 decoder: range 157
Pass gb18030 decoder: range 158
Pass gb18030 decoder: range 159
Pass gb18030 decoder: range 160
Pass gb18030 decoder: range 161
Pass gb18030 decoder: range 162
Pass gb18030 decoder: range 163
Pass gb18030 decoder: range 164
Pass gb18030 decoder: range 165
Pass gb18030 decoder: range 166
Pass gb18030 decoder: range 167
Pass gb18030 decoder: range 168
Pass gb18030 decoder: range 169
Pass gb18030 decoder: range 170
Pass gb18030 decoder: range 171
Pass gb18030 decoder: range 172
Pass gb18030 decoder: range 173
Pass gb18030 decoder: range 174
Pass gb18030 decoder: range 175
Pass gb18030 decoder: range 176
Pass gb18030 decoder: range 177
Pass gb18030 decoder: range 178
Pass gb18030 decoder: range 179
Pass gb18030 decoder: range 180
Pass gb18030 decoder: range 181
Pass gb18030 decoder: range 182
Pass gb18030 decoder: range 183
Pass gb18030 decoder: range 184
Pass gb18030 decoder: range 185
Pass gb18030 decoder: range 186
Pass gb18030 decoder: range 187
Pass gb18030 decoder: range 188
Pass gb18030 decoder: range 189
Pass gb18030 decoder: range 190
Pass gb18030 decoder: range 191
Pass gb18030 decoder: range 192
Pass gb18030 decoder: range 193
Pass gb18030 decoder: range 194
Pass gb18030 decoder: range 195
Pass gb18030 decoder: range 196
Pass gb18030 decoder: range 197
Pass gb18030 decoder: range 198
Pass gb18030 decoder: range 199
Pass gb18030 decoder: range 200
Pass gb18030 decoder: range 201
Pass gb18030 decoder: range 202
Pass gb18030 decoder: range 203
Pass gb18030 decoder: range 204
Pass gb18030 decoder: range 205
Pass gb18030 decoder: range 206

View file

@ -0,0 +1,259 @@
Harness status: OK
Found 254 tests
254 Pass
Pass gb18030 encoder: very basic
Pass gb18030 encoder: Euro
Pass gb18030 encoder: character
Pass gb18030 encoder: PUA
Pass gb18030 encoder: PUA #2
Pass gb18030 encoder: PUA #3
Pass gb18030 encoder: poo
Pass gb18030 encoder: Ranges pointer special case
Pass gb18030 encoder: legacy ICU special case 1
Pass gb18030 encoder: legacy ICU special case 2
Pass gb18030 encoder: legacy ICU special case 3
Pass gb18030 encoder: GB18030-2022 1
Pass gb18030 encoder: GB18030-2022 2
Pass gb18030 encoder: GB18030-2022 3
Pass gb18030 encoder: GB18030-2022 4
Pass gb18030 encoder: GB18030-2022 5
Pass gb18030 encoder: GB18030-2022 6
Pass gb18030 encoder: GB18030-2022 7
Pass gb18030 encoder: GB18030-2022 8
Pass gb18030 encoder: GB18030-2022 9
Pass gb18030 encoder: GB18030-2022 10
Pass gb18030 encoder: GB18030-2022 11
Pass gb18030 encoder: GB18030-2022 12
Pass gb18030 encoder: GB18030-2022 13
Pass gb18030 encoder: GB18030-2022 14
Pass gb18030 encoder: GB18030-2022 15
Pass gb18030 encoder: GB18030-2022 16
Pass gb18030 encoder: GB18030-2022 17
Pass gb18030 encoder: GB18030-2022 18
Pass gb18030 encoder: GB18030-2022 19
Pass gb18030 encoder: GB18030-2022 20
Pass gb18030 encoder: GB18030-2022 21
Pass gb18030 encoder: GB18030-2022 22
Pass gb18030 encoder: GB18030-2022 23
Pass gb18030 encoder: GB18030-2022 24
Pass gb18030 encoder: GB18030-2022 25
Pass gb18030 encoder: GB18030-2022 26
Pass gb18030 encoder: GB18030-2022 27
Pass gb18030 encoder: GB18030-2022 28
Pass gb18030 encoder: GB18030-2022 29
Pass gb18030 encoder: GB18030-2022 30
Pass gb18030 encoder: GB18030-2022 31
Pass gb18030 encoder: GB18030-2022 32
Pass gb18030 encoder: GB18030-2022 33
Pass gb18030 encoder: GB18030-2022 34
Pass gb18030 encoder: GB18030-2022 35
Pass gb18030 encoder: GB18030-2022 36
Pass gb18030 encoder: range 0
Pass gb18030 encoder: range 1
Pass gb18030 encoder: range 2
Pass gb18030 encoder: range 3
Pass gb18030 encoder: range 4
Pass gb18030 encoder: range 5
Pass gb18030 encoder: range 6
Pass gb18030 encoder: range 7
Pass gb18030 encoder: range 8
Pass gb18030 encoder: range 9
Pass gb18030 encoder: range 10
Pass gb18030 encoder: range 11
Pass gb18030 encoder: range 12
Pass gb18030 encoder: range 13
Pass gb18030 encoder: range 14
Pass gb18030 encoder: range 15
Pass gb18030 encoder: range 16
Pass gb18030 encoder: range 17
Pass gb18030 encoder: range 18
Pass gb18030 encoder: range 19
Pass gb18030 encoder: range 20
Pass gb18030 encoder: range 21
Pass gb18030 encoder: range 22
Pass gb18030 encoder: range 23
Pass gb18030 encoder: range 24
Pass gb18030 encoder: range 25
Pass gb18030 encoder: range 26
Pass gb18030 encoder: range 27
Pass gb18030 encoder: range 28
Pass gb18030 encoder: range 29
Pass gb18030 encoder: range 30
Pass gb18030 encoder: range 31
Pass gb18030 encoder: range 32
Pass gb18030 encoder: range 33
Pass gb18030 encoder: range 34
Pass gb18030 encoder: range 35
Pass gb18030 encoder: range 36
Pass gb18030 encoder: range 37
Pass gb18030 encoder: range 38
Pass gb18030 encoder: range 39
Pass gb18030 encoder: range 40
Pass gb18030 encoder: range 41
Pass gb18030 encoder: range 42
Pass gb18030 encoder: range 43
Pass gb18030 encoder: range 44
Pass gb18030 encoder: range 45
Pass gb18030 encoder: range 46
Pass gb18030 encoder: range 47
Pass gb18030 encoder: range 48
Pass gb18030 encoder: range 49
Pass gb18030 encoder: range 50
Pass gb18030 encoder: range 51
Pass gb18030 encoder: range 52
Pass gb18030 encoder: range 53
Pass gb18030 encoder: range 54
Pass gb18030 encoder: range 55
Pass gb18030 encoder: range 56
Pass gb18030 encoder: range 57
Pass gb18030 encoder: range 58
Pass gb18030 encoder: range 59
Pass gb18030 encoder: range 60
Pass gb18030 encoder: range 61
Pass gb18030 encoder: range 62
Pass gb18030 encoder: range 63
Pass gb18030 encoder: range 64
Pass gb18030 encoder: range 65
Pass gb18030 encoder: range 66
Pass gb18030 encoder: range 67
Pass gb18030 encoder: range 68
Pass gb18030 encoder: range 69
Pass gb18030 encoder: range 70
Pass gb18030 encoder: range 71
Pass gb18030 encoder: range 72
Pass gb18030 encoder: range 73
Pass gb18030 encoder: range 74
Pass gb18030 encoder: range 75
Pass gb18030 encoder: range 76
Pass gb18030 encoder: range 77
Pass gb18030 encoder: range 78
Pass gb18030 encoder: range 79
Pass gb18030 encoder: range 80
Pass gb18030 encoder: range 81
Pass gb18030 encoder: range 82
Pass gb18030 encoder: range 83
Pass gb18030 encoder: range 84
Pass gb18030 encoder: range 85
Pass gb18030 encoder: range 86
Pass gb18030 encoder: range 87
Pass gb18030 encoder: range 88
Pass gb18030 encoder: range 89
Pass gb18030 encoder: range 90
Pass gb18030 encoder: range 91
Pass gb18030 encoder: range 92
Pass gb18030 encoder: range 93
Pass gb18030 encoder: range 94
Pass gb18030 encoder: range 95
Pass gb18030 encoder: range 96
Pass gb18030 encoder: range 97
Pass gb18030 encoder: range 98
Pass gb18030 encoder: range 99
Pass gb18030 encoder: range 100
Pass gb18030 encoder: range 101
Pass gb18030 encoder: range 102
Pass gb18030 encoder: range 103
Pass gb18030 encoder: range 104
Pass gb18030 encoder: range 105
Pass gb18030 encoder: range 106
Pass gb18030 encoder: range 107
Pass gb18030 encoder: range 108
Pass gb18030 encoder: range 109
Pass gb18030 encoder: range 110
Pass gb18030 encoder: range 111
Pass gb18030 encoder: range 112
Pass gb18030 encoder: range 113
Pass gb18030 encoder: range 114
Pass gb18030 encoder: range 115
Pass gb18030 encoder: range 116
Pass gb18030 encoder: range 117
Pass gb18030 encoder: range 118
Pass gb18030 encoder: range 119
Pass gb18030 encoder: range 120
Pass gb18030 encoder: range 121
Pass gb18030 encoder: range 122
Pass gb18030 encoder: range 123
Pass gb18030 encoder: range 124
Pass gb18030 encoder: range 125
Pass gb18030 encoder: range 126
Pass gb18030 encoder: range 127
Pass gb18030 encoder: range 128
Pass gb18030 encoder: range 129
Pass gb18030 encoder: range 130
Pass gb18030 encoder: range 131
Pass gb18030 encoder: range 132
Pass gb18030 encoder: range 133
Pass gb18030 encoder: range 134
Pass gb18030 encoder: range 135
Pass gb18030 encoder: range 136
Pass gb18030 encoder: range 137
Pass gb18030 encoder: range 138
Pass gb18030 encoder: range 139
Pass gb18030 encoder: range 140
Pass gb18030 encoder: range 141
Pass gb18030 encoder: range 142
Pass gb18030 encoder: range 143
Pass gb18030 encoder: range 144
Pass gb18030 encoder: range 145
Pass gb18030 encoder: range 146
Pass gb18030 encoder: range 147
Pass gb18030 encoder: range 148
Pass gb18030 encoder: range 149
Pass gb18030 encoder: range 150
Pass gb18030 encoder: range 151
Pass gb18030 encoder: range 152
Pass gb18030 encoder: range 153
Pass gb18030 encoder: range 154
Pass gb18030 encoder: range 155
Pass gb18030 encoder: range 156
Pass gb18030 encoder: range 157
Pass gb18030 encoder: range 158
Pass gb18030 encoder: range 159
Pass gb18030 encoder: range 160
Pass gb18030 encoder: range 161
Pass gb18030 encoder: range 162
Pass gb18030 encoder: range 163
Pass gb18030 encoder: range 164
Pass gb18030 encoder: range 165
Pass gb18030 encoder: range 166
Pass gb18030 encoder: range 167
Pass gb18030 encoder: range 168
Pass gb18030 encoder: range 169
Pass gb18030 encoder: range 170
Pass gb18030 encoder: range 171
Pass gb18030 encoder: range 172
Pass gb18030 encoder: range 173
Pass gb18030 encoder: range 174
Pass gb18030 encoder: range 175
Pass gb18030 encoder: range 176
Pass gb18030 encoder: range 177
Pass gb18030 encoder: range 178
Pass gb18030 encoder: range 179
Pass gb18030 encoder: range 180
Pass gb18030 encoder: range 181
Pass gb18030 encoder: range 182
Pass gb18030 encoder: range 183
Pass gb18030 encoder: range 184
Pass gb18030 encoder: range 185
Pass gb18030 encoder: range 186
Pass gb18030 encoder: range 187
Pass gb18030 encoder: range 188
Pass gb18030 encoder: range 189
Pass gb18030 encoder: range 190
Pass gb18030 encoder: range 191
Pass gb18030 encoder: range 192
Pass gb18030 encoder: range 193
Pass gb18030 encoder: range 194
Pass gb18030 encoder: range 195
Pass gb18030 encoder: range 196
Pass gb18030 encoder: range 197
Pass gb18030 encoder: range 198
Pass gb18030 encoder: range 199
Pass gb18030 encoder: range 200
Pass gb18030 encoder: range 201
Pass gb18030 encoder: range 202
Pass gb18030 encoder: range 203
Pass gb18030 encoder: range 204
Pass gb18030 encoder: range 205
Pass gb18030 encoder: range 206

View file

@ -0,0 +1,54 @@
Harness status: OK
Found 49 tests
49 Pass
Pass gbk encoder: very basic
Pass gbk encoder: Euro
Pass gbk encoder: character
Pass gbk encoder: PUA
Pass gbk encoder: PUA #2
Pass gbk encoder: poo
Pass gbk encoder: legacy ICU special case 1
Pass gbk encoder: legacy ICU special case 2
Pass gbk encoder: legacy ICU special case 3
Pass gbk encoder: legacy WebKit case 1
Pass gbk encoder: legacy WebKit case 2
Pass gbk encoder: legacy WebKit case 3
Pass gbk encoder: U+10FFFF
Pass gbk encoder: GB18030-2022 1
Pass gbk encoder: GB18030-2022 2
Pass gbk encoder: GB18030-2022 3
Pass gbk encoder: GB18030-2022 4
Pass gbk encoder: GB18030-2022 5
Pass gbk encoder: GB18030-2022 6
Pass gbk encoder: GB18030-2022 7
Pass gbk encoder: GB18030-2022 8
Pass gbk encoder: GB18030-2022 9
Pass gbk encoder: GB18030-2022 10
Pass gbk encoder: GB18030-2022 11
Pass gbk encoder: GB18030-2022 12
Pass gbk encoder: GB18030-2022 13
Pass gbk encoder: GB18030-2022 14
Pass gbk encoder: GB18030-2022 15
Pass gbk encoder: GB18030-2022 16
Pass gbk encoder: GB18030-2022 17
Pass gbk encoder: GB18030-2022 18
Pass gbk encoder: GB18030-2022 19
Pass gbk encoder: GB18030-2022 20
Pass gbk encoder: GB18030-2022 21
Pass gbk encoder: GB18030-2022 22
Pass gbk encoder: GB18030-2022 23
Pass gbk encoder: GB18030-2022 24
Pass gbk encoder: GB18030-2022 25
Pass gbk encoder: GB18030-2022 26
Pass gbk encoder: GB18030-2022 27
Pass gbk encoder: GB18030-2022 28
Pass gbk encoder: GB18030-2022 29
Pass gbk encoder: GB18030-2022 30
Pass gbk encoder: GB18030-2022 31
Pass gbk encoder: GB18030-2022 32
Pass gbk encoder: GB18030-2022 33
Pass gbk encoder: GB18030-2022 34
Pass gbk encoder: GB18030-2022 35
Pass gbk encoder: GB18030-2022 36

View file

@ -0,0 +1,14 @@
<!doctype html>
<meta charset=utf-8>
<script>
self.GLOBAL = {
isWindow: function() { return true; },
isWorker: function() { return false; },
isShadowRealm: function() { return false; },
};
</script>
<script src="../../../resources/testharness.js"></script>
<script src="../../../resources/testharnessreport.js"></script>
<script src="resources/ranges.js"></script>
<div id=log></div>
<script src="gb18030-decoder.any.js"></script>

View file

@ -0,0 +1,102 @@
// META: script=./resources/ranges.js
const decode = (input, output, desc) => {
test(function () {
for (const encoding of ["gb18030", "gbk"]) {
assert_equals(
new TextDecoder(encoding).decode(new Uint8Array(input)),
output,
);
}
}, "gb18030 decoder: " + desc);
};
decode([115], "s", "ASCII");
decode([0x80], "\u20AC", "euro");
decode([0xFF], "\uFFFD", "initial byte out of accepted ranges");
decode([0x81], "\uFFFD", "end of queue, gb18030 first not 0");
decode([0x81, 0x28], "\ufffd(", "two bytes 0x81 0x28");
decode([0x81, 0x40], "\u4E02", "two bytes 0x81 0x40");
decode([0x81, 0x7E], "\u4E8A", "two bytes 0x81 0x7e");
decode([0x81, 0x7F], "\ufffd\u007f", "two bytes 0x81 0x7f");
decode([0x81, 0x80], "\u4E90", "two bytes 0x81 0x80");
decode([0x81, 0xFE], "\u4FA2", "two bytes 0x81 0xFE");
decode([0x81, 0xFF], "\ufffd", "two bytes 0x81 0xFF");
decode([0xFE, 0x40], "\uFA0C", "two bytes 0xFE 0x40");
decode([0xFE, 0xFE], "\uE4C5", "two bytes 0xFE 0xFE");
decode([0xFE, 0xFF], "\ufffd", "two bytes 0xFE 0xFF");
decode([0x81, 0x30], "\ufffd", "two bytes 0x81 0x30");
decode([0x81, 0x30, 0xFE], "\ufffd", "three bytes 0x81 0x30 0xFE");
decode([0x81, 0x30, 0xFF], "\ufffd0\ufffd", "three bytes 0x81 0x30 0xFF");
decode(
[0x81, 0x30, 0xFE, 0x29],
"\ufffd0\ufffd)",
"four bytes 0x81 0x30 0xFE 0x29",
);
decode([0xFE, 0x39, 0xFE, 0x39], "\ufffd", "four bytes 0xFE 0x39 0xFE 0x39");
decode([0x81, 0x35, 0xF4, 0x36], "\u1E3E", "pointer 7458");
decode([0x81, 0x35, 0xF4, 0x37], "\ue7c7", "pointer 7457");
decode([0x81, 0x35, 0xF4, 0x38], "\u1E40", "pointer 7459");
decode([0x84, 0x31, 0xA4, 0x39], "\uffff", "pointer 39419");
decode([0x84, 0x31, 0xA5, 0x30], "\ufffd", "pointer 39420");
decode([0x8F, 0x39, 0xFE, 0x39], "\ufffd", "pointer 189999");
decode([0x90, 0x30, 0x81, 0x30], "\u{10000}", "pointer 189000");
decode([0xE3, 0x32, 0x9A, 0x35], "\u{10FFFF}", "pointer 1237575");
decode([0xE3, 0x32, 0x9A, 0x36], "\ufffd", "pointer 1237576");
decode([0x83, 0x36, 0xC8, 0x30], "\uE7C8", "legacy ICU special case 1");
decode([0xA1, 0xAD], "\u2026", "legacy ICU special case 2");
decode([0xA1, 0xAB], "\uFF5E", "legacy ICU special case 3");
decode([0xA3, 0xA0], "\u3000");
// GB18030-2022
decode([0xA6, 0xD9], "\uFE10", "GB18030-2022 1");
decode([0xA6, 0xDA], "\uFE12", "GB18030-2022 2");
decode([0xA6, 0xDB], "\uFE11", "GB18030-2022 3");
decode([0xA6, 0xDC], "\uFE13", "GB18030-2022 4");
decode([0xA6, 0xDD], "\uFE14", "GB18030-2022 5");
decode([0xA6, 0xDE], "\uFE15", "GB18030-2022 6");
decode([0xA6, 0xDF], "\uFE16", "GB18030-2022 7");
decode([0xA6, 0xEC], "\uFE17", "GB18030-2022 8");
decode([0xA6, 0xED], "\uFE18", "GB18030-2022 9");
decode([0xA6, 0xF3], "\uFE19", "GB18030-2022 10");
decode([0xFE, 0x59], "\u9FB4", "GB18030-2022 11");
decode([0xFE, 0x61], "\u9FB5", "GB18030-2022 12");
decode([0xFE, 0x66], "\u9FB6", "GB18030-2022 13");
decode([0xFE, 0x67], "\u9FB7", "GB18030-2022 14");
decode([0xFE, 0x6D], "\u9FB8", "GB18030-2022 15");
decode([0xFE, 0x7E], "\u9FB9", "GB18030-2022 16");
decode([0xFE, 0x90], "\u9FBA", "GB18030-2022 17");
decode([0xFE, 0xA0], "\u9FBB", "GB18030-2022 18");
decode([0x82, 0x35, 0x90, 0x37], "\u9FB4", "GB18030-2022 19");
decode([0x82, 0x35, 0x90, 0x38], "\u9FB5", "GB18030-2022 20");
decode([0x82, 0x35, 0x90, 0x39], "\u9FB6", "GB18030-2022 21");
decode([0x82, 0x35, 0x91, 0x30], "\u9FB7", "GB18030-2022 22");
decode([0x82, 0x35, 0x91, 0x31], "\u9FB8", "GB18030-2022 23");
decode([0x82, 0x35, 0x91, 0x32], "\u9FB9", "GB18030-2022 24");
decode([0x82, 0x35, 0x91, 0x33], "\u9FBA", "GB18030-2022 25");
decode([0x82, 0x35, 0x91, 0x34], "\u9FBB", "GB18030-2022 26");
decode([0x84, 0x31, 0x82, 0x36], "\uFE10", "GB18030-2022 27");
decode([0x84, 0x31, 0x82, 0x37], "\uFE11", "GB18030-2022 28");
decode([0x84, 0x31, 0x82, 0x38], "\uFE12", "GB18030-2022 29");
decode([0x84, 0x31, 0x82, 0x39], "\uFE13", "GB18030-2022 30");
decode([0x84, 0x31, 0x83, 0x30], "\uFE14", "GB18030-2022 31");
decode([0x84, 0x31, 0x83, 0x31], "\uFE15", "GB18030-2022 32");
decode([0x84, 0x31, 0x83, 0x32], "\uFE16", "GB18030-2022 33");
decode([0x84, 0x31, 0x83, 0x33], "\uFE17", "GB18030-2022 34");
decode([0x84, 0x31, 0x83, 0x34], "\uFE18", "GB18030-2022 35");
decode([0x84, 0x31, 0x83, 0x35], "\uFE19", "GB18030-2022 36");
let i = 0;
for (const range of ranges) {
const pointer = range[0];
decode(
[
Math.floor(pointer / 12600) + 0x81,
Math.floor((pointer % 12600) / 1260) + 0x30,
Math.floor((pointer % 1260) / 10) + 0x81,
pointer % 10 + 0x30,
],
range[1],
"range " + i++,
);
}

View file

@ -0,0 +1,9 @@
<!doctype html>
<meta charset=utf-8>
<script src="../../../resources/testharness.js"></script>
<script src="../../../resources/testharnessreport.js"></script>
<div id=log></div>
<script>
fetch_tests_from_worker(new Worker("../../../encoding/legacy-mb-schinese/gb18030/gb18030-decoder.any.worker.js"));
</script>

View file

@ -0,0 +1,10 @@
self.GLOBAL = {
isWindow: function() { return false; },
isWorker: function() { return true; },
isShadowRealm: function() { return false; },
};
importScripts("/resources/testharness.js");
importScripts("./resources/ranges.js")
importScripts("/encoding/legacy-mb-schinese/gb18030/gb18030-decoder.any.js");
done();

View file

@ -0,0 +1,86 @@
<!doctype html>
<meta charset=gb18030>
<script src=../../../resources/testharness.js></script>
<script src=../../../resources/testharnessreport.js></script>
<script src=resources/ranges.js></script>
<script>
const encode = (input, output, desc) => {
test(function() {
const a = document.createElement("a"); // <a> uses document encoding for URL's query
a.href = "https://example.com/?" + input;
assert_equals(a.search.substr(1), output); // remove leading "?"
}, "gb18030 encoder: " + desc);
}
encode("s", "s", "very basic");
encode("\u20AC", "%A2%E3", "Euro");
encode("\u4E02", "%81@", "character");
encode("\uE4C6", "%A1@", "PUA");
encode("\uE4C5", "%FE%FE", "PUA #2");
encode("\uE5E5", "%26%2358853%3B", "PUA #3");
encode("\ud83d\udca9", "%949%DA3", "poo");
encode("\uE7C7", "%815%F47", "Ranges pointer special case");
encode("\uE7C8", "%836%C80", "legacy ICU special case 1");
encode("\u2026", "%A1%AD", "legacy ICU special case 2");
encode("\uFF5E", "%A1%AB", "legacy ICU special case 3");
// GB18030-2022
encode("\uFE10", "%A6%D9", "GB18030-2022 1");
encode("\uFE12", "%A6%DA", "GB18030-2022 2");
encode("\uFE11", "%A6%DB", "GB18030-2022 3");
encode("\uFE13", "%A6%DC", "GB18030-2022 4");
encode("\uFE14", "%A6%DD", "GB18030-2022 5");
encode("\uFE15", "%A6%DE", "GB18030-2022 6");
encode("\uFE16", "%A6%DF", "GB18030-2022 7");
encode("\uFE17", "%A6%EC", "GB18030-2022 8");
encode("\uFE18", "%A6%ED", "GB18030-2022 9");
encode("\uFE19", "%A6%F3", "GB18030-2022 10");
encode("\u9FB4", "%FEY", "GB18030-2022 11");
encode("\u9FB5", "%FEa", "GB18030-2022 12");
encode("\u9FB6", "%FEf", "GB18030-2022 13");
encode("\u9FB7", "%FEg", "GB18030-2022 14");
encode("\u9FB8", "%FEm", "GB18030-2022 15");
encode("\u9FB9", "%FE~", "GB18030-2022 16");
encode("\u9FBA", "%FE%90", "GB18030-2022 17");
encode("\u9FBB", "%FE%A0", "GB18030-2022 18");
encode("\uE78D", "%A6%D9", "GB18030-2022 19");
encode("\uE78E", "%A6%DA", "GB18030-2022 20");
encode("\uE78F", "%A6%DB", "GB18030-2022 21");
encode("\uE790", "%A6%DC", "GB18030-2022 22");
encode("\uE791", "%A6%DD", "GB18030-2022 23");
encode("\uE792", "%A6%DE", "GB18030-2022 24");
encode("\uE793", "%A6%DF", "GB18030-2022 25");
encode("\uE794", "%A6%EC", "GB18030-2022 26");
encode("\uE795", "%A6%ED", "GB18030-2022 27");
encode("\uE796", "%A6%F3", "GB18030-2022 28");
encode("\uE81E", "%FEY", "GB18030-2022 29");
encode("\uE826", "%FEa", "GB18030-2022 30");
encode("\uE82B", "%FEf", "GB18030-2022 31");
encode("\uE82C", "%FEg", "GB18030-2022 32");
encode("\uE832", "%FEm", "GB18030-2022 33");
encode("\uE843", "%FE~", "GB18030-2022 34");
encode("\uE854", "%FE%90", "GB18030-2022 35");
encode("\uE864", "%FE%A0", "GB18030-2022 36");
const upperCaseNibble = x => {
return Math.floor(x).toString(16).toUpperCase();
}
const encodePointer = pointer => {
const firstByte = Math.floor(pointer / 12600) + 0x81;
const thirdByte = Math.floor((pointer % 1260) / 10) + 0x81;
return "%"
+ upperCaseNibble(firstByte / 16)
+ upperCaseNibble(firstByte % 16)
+ String.fromCharCode(Math.floor((pointer % 12600) / 1260) + 0x30)
+ "%"
+ upperCaseNibble(thirdByte / 16)
+ upperCaseNibble(thirdByte % 16)
+ String.fromCharCode(pointer % 10 + 0x30);
}
let i = 0;
for (const range of ranges) {
encode(range[1], encodePointer(range[0]), "range " + i++);
}
</script>

View file

@ -0,0 +1,210 @@
// Based on https://encoding.spec.whatwg.org/index-gb18030-ranges.txt
const ranges = [
[0, "\u0080"],
[36, "\u00A5"],
[38, "\u00A9"],
[45, "\u00B2"],
[50, "\u00B8"],
[81, "\u00D8"],
[89, "\u00E2"],
[95, "\u00EB"],
[96, "\u00EE"],
[100, "\u00F4"],
[103, "\u00F8"],
[104, "\u00FB"],
[105, "\u00FD"],
[109, "\u0102"],
[126, "\u0114"],
[133, "\u011C"],
[148, "\u012C"],
[172, "\u0145"],
[175, "\u0149"],
[179, "\u014E"],
[208, "\u016C"],
[306, "\u01CF"],
[307, "\u01D1"],
[308, "\u01D3"],
[309, "\u01D5"],
[310, "\u01D7"],
[311, "\u01D9"],
[312, "\u01DB"],
[313, "\u01DD"],
[341, "\u01FA"],
[428, "\u0252"],
[443, "\u0262"],
[544, "\u02C8"],
[545, "\u02CC"],
[558, "\u02DA"],
[741, "\u03A2"],
[742, "\u03AA"],
[749, "\u03C2"],
[750, "\u03CA"],
[805, "\u0402"],
[819, "\u0450"],
[820, "\u0452"],
[7922, "\u2011"],
[7924, "\u2017"],
[7925, "\u201A"],
[7927, "\u201E"],
[7934, "\u2027"],
[7943, "\u2031"],
[7944, "\u2034"],
[7945, "\u2036"],
[7950, "\u203C"],
[8062, "\u20AD"],
[8148, "\u2104"],
[8149, "\u2106"],
[8152, "\u210A"],
[8164, "\u2117"],
[8174, "\u2122"],
[8236, "\u216C"],
[8240, "\u217A"],
[8262, "\u2194"],
[8264, "\u219A"],
[8374, "\u2209"],
[8380, "\u2210"],
[8381, "\u2212"],
[8384, "\u2216"],
[8388, "\u221B"],
[8390, "\u2221"],
[8392, "\u2224"],
[8393, "\u2226"],
[8394, "\u222C"],
[8396, "\u222F"],
[8401, "\u2238"],
[8406, "\u223E"],
[8416, "\u2249"],
[8419, "\u224D"],
[8424, "\u2253"],
[8437, "\u2262"],
[8439, "\u2268"],
[8445, "\u2270"],
[8482, "\u2296"],
[8485, "\u229A"],
[8496, "\u22A6"],
[8521, "\u22C0"],
[8603, "\u2313"],
[8936, "\u246A"],
[8946, "\u249C"],
[9046, "\u254C"],
[9050, "\u2574"],
[9063, "\u2590"],
[9066, "\u2596"],
[9076, "\u25A2"],
[9092, "\u25B4"],
[9100, "\u25BE"],
[9108, "\u25C8"],
[9111, "\u25CC"],
[9113, "\u25D0"],
[9131, "\u25E6"],
[9162, "\u2607"],
[9164, "\u260A"],
[9218, "\u2641"],
[9219, "\u2643"],
[11329, "\u2E82"],
[11331, "\u2E85"],
[11334, "\u2E89"],
[11336, "\u2E8D"],
[11346, "\u2E98"],
[11361, "\u2EA8"],
[11363, "\u2EAB"],
[11366, "\u2EAF"],
[11370, "\u2EB4"],
[11372, "\u2EB8"],
[11375, "\u2EBC"],
[11389, "\u2ECB"],
[11682, "\u2FFC"],
[11686, "\u3004"],
[11687, "\u3018"],
[11692, "\u301F"],
[11694, "\u302A"],
[11714, "\u303F"],
[11716, "\u3094"],
[11723, "\u309F"],
[11725, "\u30F7"],
[11730, "\u30FF"],
[11736, "\u312A"],
[11982, "\u322A"],
[11989, "\u3232"],
[12102, "\u32A4"],
[12336, "\u3390"],
[12348, "\u339F"],
[12350, "\u33A2"],
[12384, "\u33C5"],
[12393, "\u33CF"],
[12395, "\u33D3"],
[12397, "\u33D6"],
[12510, "\u3448"],
[12553, "\u3474"],
[12851, "\u359F"],
[12962, "\u360F"],
[12973, "\u361B"],
[13738, "\u3919"],
[13823, "\u396F"],
[13919, "\u39D1"],
[13933, "\u39E0"],
[14080, "\u3A74"],
[14298, "\u3B4F"],
[14585, "\u3C6F"],
[14698, "\u3CE1"],
[15583, "\u4057"],
[15847, "\u4160"],
[16318, "\u4338"],
[16434, "\u43AD"],
[16438, "\u43B2"],
[16481, "\u43DE"],
[16729, "\u44D7"],
[17102, "\u464D"],
[17122, "\u4662"],
[17315, "\u4724"],
[17320, "\u472A"],
[17402, "\u477D"],
[17418, "\u478E"],
[17859, "\u4948"],
[17909, "\u497B"],
[17911, "\u497E"],
[17915, "\u4984"],
[17916, "\u4987"],
[17936, "\u499C"],
[17939, "\u49A0"],
[17961, "\u49B8"],
[18664, "\u4C78"],
[18703, "\u4CA4"],
[18814, "\u4D1A"],
[18962, "\u4DAF"],
[19043, "\u9FA6"],
[33469, "\uE76C"],
[33470, "\uE7C8"],
[33471, "\uE7E7"],
[33484, "\uE815"],
[33485, "\uE819"],
[33490, "\uE81F"],
[33497, "\uE827"],
[33501, "\uE82D"],
[33505, "\uE833"],
[33513, "\uE83C"],
[33520, "\uE844"],
[33536, "\uE856"],
[33550, "\uE865"],
[37845, "\uF92D"],
[37921, "\uF97A"],
[37948, "\uF996"],
[38029, "\uF9E8"],
[38038, "\uF9F2"],
[38064, "\uFA10"],
[38065, "\uFA12"],
[38066, "\uFA15"],
[38069, "\uFA19"],
[38075, "\uFA22"],
[38076, "\uFA25"],
[38078, "\uFA2A"],
[39108, "\uFE32"],
[39109, "\uFE45"],
[39113, "\uFE53"],
[39114, "\uFE58"],
[39115, "\uFE67"],
[39116, "\uFE6C"],
[39265, "\uFF5F"],
[39394, "\uFFE6"],
[189000, "\u{10000}"]
];

View file

@ -0,0 +1,65 @@
<!doctype html>
<meta charset=gbk> <!-- if the server overrides this, it is stupid, as this is a testsuite -->
<script src=../../../resources/testharness.js></script>
<script src=../../../resources/testharnessreport.js></script>
<script>
function encode(input, output, desc) {
test(function() {
const a = document.createElement("a") // <a> uses document encoding for URL's query
a.href = "https://example.com/?" + input;
assert_equals(a.search.substr(1), output); // remove leading "?"
}, "gbk encoder: " + desc);
}
encode("s", "s", "very basic");
encode("\u20AC", "%80", "Euro");
encode("\u4E02", "%81@", "character");
encode("\uE4C6", "%A1@", "PUA");
encode("\uE4C5", "%FE%FE", "PUA #2");
encode("\ud83d\udca9", "%26%23128169%3B", "poo");
encode("\uE7C8", "%26%2359336%3B", "legacy ICU special case 1");
encode("\u2026", "%A1%AD", "legacy ICU special case 2");
encode("\uFF5E", "%A1%AB", "legacy ICU special case 3");
encode("\u00A5", "%26%23165%3B", "legacy WebKit case 1");
encode("\u22EF", "%26%238943%3B", "legacy WebKit case 2");
encode("\u301C", "%26%2312316%3B", "legacy WebKit case 3");
encode("\u{10FFFF}", "%26%231114111%3B", "U+10FFFF");
// GB18030-2022
encode("\uFE10", "%A6%D9", "GB18030-2022 1");
encode("\uFE12", "%A6%DA", "GB18030-2022 2");
encode("\uFE11", "%A6%DB", "GB18030-2022 3");
encode("\uFE13", "%A6%DC", "GB18030-2022 4");
encode("\uFE14", "%A6%DD", "GB18030-2022 5");
encode("\uFE15", "%A6%DE", "GB18030-2022 6");
encode("\uFE16", "%A6%DF", "GB18030-2022 7");
encode("\uFE17", "%A6%EC", "GB18030-2022 8");
encode("\uFE18", "%A6%ED", "GB18030-2022 9");
encode("\uFE19", "%A6%F3", "GB18030-2022 10");
encode("\u9FB4", "%FEY", "GB18030-2022 11");
encode("\u9FB5", "%FEa", "GB18030-2022 12");
encode("\u9FB6", "%FEf", "GB18030-2022 13");
encode("\u9FB7", "%FEg", "GB18030-2022 14");
encode("\u9FB8", "%FEm", "GB18030-2022 15");
encode("\u9FB9", "%FE~", "GB18030-2022 16");
encode("\u9FBA", "%FE%90", "GB18030-2022 17");
encode("\u9FBB", "%FE%A0", "GB18030-2022 18");
encode("\uE78D", "%A6%D9", "GB18030-2022 19");
encode("\uE78E", "%A6%DA", "GB18030-2022 20");
encode("\uE78F", "%A6%DB", "GB18030-2022 21");
encode("\uE790", "%A6%DC", "GB18030-2022 22");
encode("\uE791", "%A6%DD", "GB18030-2022 23");
encode("\uE792", "%A6%DE", "GB18030-2022 24");
encode("\uE793", "%A6%DF", "GB18030-2022 25");
encode("\uE794", "%A6%EC", "GB18030-2022 26");
encode("\uE795", "%A6%ED", "GB18030-2022 27");
encode("\uE796", "%A6%F3", "GB18030-2022 28");
encode("\uE81E", "%FEY", "GB18030-2022 29");
encode("\uE826", "%FEa", "GB18030-2022 30");
encode("\uE82B", "%FEf", "GB18030-2022 31");
encode("\uE82C", "%FEg", "GB18030-2022 32");
encode("\uE832", "%FEm", "GB18030-2022 33");
encode("\uE843", "%FE~", "GB18030-2022 34");
encode("\uE854", "%FE%90", "GB18030-2022 35");
encode("\uE864", "%FE%A0", "GB18030-2022 36");
</script>