Skip to content

Commit 0c62ea4

Browse files
committed
FIX: iconv not accepting utf8 codepage on BSD systems
resolves: Oldes/Rebol-issues#2475
1 parent 5a8c6e0 commit 0c62ea4

File tree

2 files changed

+138
-101
lines changed

2 files changed

+138
-101
lines changed

src/core/u-iconv.c

+129-101
Original file line numberDiff line numberDiff line change
@@ -83,21 +83,18 @@ static struct {
8383
{12001, "UCS4BE"},
8484
{12001, "CP12001"},
8585

86-
//#ifndef GLIB_COMPILATION
87-
// /*
88-
// * Default is big endian.
89-
// * See rfc2781 4.3 Interpreting text labelled as UTF-16.
90-
// */
91-
// {1201, "UTF16"},
92-
// {1201, "UTF-16"},
93-
// {1201, "UCS2"},
94-
// {1201, "UCS-2"},
95-
// {12001, "UTF32"},
96-
// {12001, "UTF-32"},
97-
// {12001, "UCS-4"},
98-
// {12001, "UCS4"},
99-
//#else
100-
/* Default is little endian, because the platform is */
86+
#ifdef BIG_ENDIAN
87+
// Big endian...
88+
{1201, "UTF16"},
89+
{1201, "UTF-16"},
90+
{1201, "UCS2"},
91+
{1201, "UCS-2"},
92+
{12001, "UTF32"},
93+
{12001, "UTF-32"},
94+
{12001, "UCS-4"},
95+
{12001, "UCS4"},
96+
#else
97+
// Little endian variants
10198
{1200, "UTF-16"},
10299
{1200, "UTF16"},
103100
{1200, "UCS-2"},
@@ -106,7 +103,7 @@ static struct {
106103
{12000, "UTF32"},
107104
{12000, "UCS-4"},
108105
{12000, "UCS4"},
109-
//#endif
106+
#endif
110107

111108
/* copy from libiconv `iconv -l` */
112109
/* !IsValidCodePage(367) */
@@ -231,6 +228,7 @@ static struct {
231228
{936, "WINDOWS-936"},
232229

233230
{950, "CP950"},
231+
{950, "BIG-5"},
234232
{950, "BIG5"},
235233
{950, "BIG5HKSCS"},
236234
{950, "BIG5-HKSCS"},
@@ -319,31 +317,32 @@ static struct {
319317
/* 709 Arabic (ASMO-449+, BCON V4) */
320318
/* 710 Arabic - Transparent Arabic */
321319
{720, "DOS-720"}, /* Arabic (Transparent ASMO); Arabic (DOS) */
322-
{737, "ibm737"}, /* OEM Greek (formerly 437G); Greek (DOS) */
323-
{775, "ibm775"}, /* OEM Baltic; Baltic (DOS) */
324-
{850, "ibm850"}, /* OEM Multilingual Latin 1; Western European (DOS) */
325-
{852, "ibm852"}, /* OEM Latin 2; Central European (DOS) */
320+
{737, "IBM737"}, /* OEM Greek (formerly 437G); Greek (DOS) */
321+
{775, "IBM775"}, /* OEM Baltic; Baltic (DOS) */
322+
{850, "IBM850"}, /* OEM Multilingual Latin 1; Western European (DOS) */
323+
{852, "IBM852"}, /* OEM Latin 2; Central European (DOS) */
326324
{855, "IBM855"}, /* OEM Cyrillic (primarily Russian) */
327-
{857, "ibm857"}, /* OEM Turkish; Turkish (DOS) */
325+
{857, "IBM857"}, /* OEM Turkish; Turkish (DOS) */
328326
{858, "IBM00858"}, /* OEM Multilingual Latin 1 + Euro symbol */
329327
{860, "IBM860"}, /* OEM Portuguese; Portuguese (DOS) */
330-
{861, "ibm861"}, /* OEM Icelandic; Icelandic (DOS) */
328+
{861, "IBM861"}, /* OEM Icelandic; Icelandic (DOS) */
331329
{862, "DOS-862"}, /* OEM Hebrew; Hebrew (DOS) */
332330
{863, "IBM863"}, /* OEM French Canadian; French Canadian (DOS) */
333331
{864, "IBM864"}, /* OEM Arabic; Arabic (864) */
334332
{865, "IBM865"}, /* OEM Nordic; Nordic (DOS) */
335-
{866, "cp866"}, /* OEM Russian; Cyrillic (DOS) */
336-
{869, "ibm869"}, /* OEM Modern Greek; Greek, Modern (DOS) */
333+
{866, "CP866"}, /* OEM Russian; Cyrillic (DOS) */
334+
{869, "IBM869"}, /* OEM Modern Greek; Greek, Modern (DOS) */
337335
{870, "IBM870"}, /* IBM EBCDIC Multilingual/ROECE (Latin 2); IBM EBCDIC Multilingual Latin 2 */
338-
{874, "windows-874"}, /* ANSI/OEM Thai (same as 28605, ISO 8859-15); Thai (Windows) */
339-
{875, "cp875"}, /* IBM EBCDIC Greek Modern */
340-
{932, "shift_jis"}, /* ANSI/OEM Japanese; Japanese (Shift-JIS) */
341-
{932, "shift-jis"}, /* alternative name for it */
342-
{936, "gb2312"}, /* ANSI/OEM Simplified Chinese (PRC, Singapore); Chinese Simplified (GB2312) */
343-
{949, "ks_c_5601-1987"}, /* ANSI/OEM Korean (Unified Hangul Code) */
344-
{950, "big5"}, /* ANSI/OEM Traditional Chinese (Taiwan; Hong Kong SAR, PRC); Chinese Traditional (Big5) */
345-
{950, "big5hkscs"}, /* ANSI/OEM Traditional Chinese (Hong Kong SAR); Chinese Traditional (Big5-HKSCS) */
346-
{950, "big5-hkscs"}, /* alternative name for it */
336+
{874, "WINDOWS-874"}, /* ANSI/OEM Thai (same as 28605, ISO 8859-15); Thai (Windows) */
337+
{875, "CP875"}, /* IBM EBCDIC Greek Modern */
338+
{932, "SHIFT_JIS"}, /* ANSI/OEM Japanese; Japanese (Shift-JIS) */
339+
{932, "SHIFT-JIS"}, /* alternative name for it */
340+
{936, "GB2312"}, /* ANSI/OEM Simplified Chinese (PRC, Singapore); Chinese Simplified (GB2312) */
341+
{949, "KS_C_5601-1987"}, /* ANSI/OEM Korean (Unified Hangul Code) */
342+
{950, "BIG-5"}, /* ANSI/OEM Traditional Chinese (Taiwan; Hong Kong SAR, PRC); Chinese Traditional (Big5) */
343+
{950, "BIG5"},
344+
{950, "BIG5-HKSCS"}, /* ANSI/OEM Traditional Chinese (Hong Kong SAR); Chinese Traditional (Big5-HKSCS) */
345+
{950, "BIG5HKSCS"}, /* alternative name for it */
347346
{1026, "IBM1026"}, /* IBM EBCDIC Turkish (Latin 5) */
348347
{1047, "IBM01047"}, /* IBM EBCDIC Latin 1/Open System */
349348
{1140, "IBM01140"}, /* IBM EBCDIC US-Canada (037 + Euro symbol); IBM EBCDIC (US-Canada-Euro) */
@@ -365,8 +364,8 @@ static struct {
365364
{1256, "windows-1256"}, /* ANSI Arabic; Arabic (Windows) */
366365
{1257, "windows-1257"}, /* ANSI Baltic; Baltic (Windows) */
367366
{1258, "windows-1258"}, /* ANSI/OEM Vietnamese; Vietnamese (Windows) */
368-
{1361, "Johab"}, /* Korean (Johab) */
369-
{10000, "macintosh"}, /* MAC Roman; Western European (Mac) */
367+
{1361, "JOHAB"}, /* Korean (Johab) */
368+
{10000, "MACINTOSH"}, /* MAC Roman; Western European (Mac) */
370369
{10001, "x-mac-japanese"}, /* Japanese (Mac) */
371370
{10002, "x-mac-chinesetrad"}, /* MAC Traditional Chinese (Big5); Chinese Traditional (Mac) */
372371
{10003, "x-mac-korean"}, /* Korean (Mac) */
@@ -392,7 +391,7 @@ static struct {
392391
{20106, "x-IA5-German"}, /* IA5 German (7-bit) */
393392
{20107, "x-IA5-Swedish"}, /* IA5 Swedish (7-bit) */
394393
{20108, "x-IA5-Norwegian"}, /* IA5 Norwegian (7-bit) */
395-
{20127, "us-ascii"}, /* US-ASCII (7-bit) */
394+
{20127, "US-ASCII"}, /* US-ASCII (7-bit) */
396395
{20261, "x-cp20261"}, /* T.61 */
397396
{20269, "x-cp20269"}, /* ISO 6937 Non-Spacing Accent */
398397
{20273, "IBM273"}, /* IBM EBCDIC Germany */
@@ -408,71 +407,71 @@ static struct {
408407
{20424, "IBM424"}, /* IBM EBCDIC Hebrew */
409408
{20833, "x-EBCDIC-KoreanExtended"}, /* IBM EBCDIC Korean Extended */
410409
{20838, "IBM-Thai"}, /* IBM EBCDIC Thai */
411-
{20866, "koi8-r"}, /* Russian (KOI8-R); Cyrillic (KOI8-R) */
410+
{20866, "KOI8-R"}, /* Russian (KOI8-R); Cyrillic (KOI8-R) */
412411
{20871, "IBM871"}, /* IBM EBCDIC Icelandic */
413412
{20880, "IBM880"}, /* IBM EBCDIC Cyrillic Russian */
414413
{20905, "IBM905"}, /* IBM EBCDIC Turkish */
415414
{20924, "IBM00924"}, /* IBM EBCDIC Latin 1/Open System (1047 + Euro symbol) */
416415
{20932, "EUC-JP"}, /* Japanese (JIS 0208-1990 and 0121-1990) */
417416
{20936, "x-cp20936"}, /* Simplified Chinese (GB2312); Chinese Simplified (GB2312-80) */
418417
{20949, "x-cp20949"}, /* Korean Wansung */
419-
{21025, "cp1025"}, /* IBM EBCDIC Cyrillic Serbian-Bulgarian */
418+
{21025, "CP1025"}, /* IBM EBCDIC Cyrillic Serbian-Bulgarian */
420419
/* 21027 (deprecated) */
421-
{21866, "koi8-u"}, /* Ukrainian (KOI8-U); Cyrillic (KOI8-U) */
422-
{28591, "iso-8859-1"}, /* ISO 8859-1 Latin 1; Western European (ISO) */
423-
{28591, "iso8859-1"}, /* ISO 8859-1 Latin 1; Western European (ISO) */
424-
{28591, "iso_8859-1"},
425-
{28591, "iso_8859_1"},
426-
{28592, "iso-8859-2"}, /* ISO 8859-2 Central European; Central European (ISO) */
427-
{28592, "iso8859-2"}, /* ISO 8859-2 Central European; Central European (ISO) */
428-
{28592, "iso_8859-2"},
429-
{28592, "iso_8859_2"},
430-
{28593, "iso-8859-3"}, /* ISO 8859-3 Latin 3 */
431-
{28593, "iso8859-3"}, /* ISO 8859-3 Latin 3 */
432-
{28593, "iso_8859-3"},
433-
{28593, "iso_8859_3"},
434-
{28594, "iso-8859-4"}, /* ISO 8859-4 Baltic */
435-
{28594, "iso8859-4"}, /* ISO 8859-4 Baltic */
436-
{28594, "iso_8859-4"},
437-
{28594, "iso_8859_4"},
438-
{28595, "iso-8859-5"}, /* ISO 8859-5 Cyrillic */
439-
{28595, "iso8859-5"}, /* ISO 8859-5 Cyrillic */
440-
{28595, "iso_8859-5"},
441-
{28595, "iso_8859_5"},
442-
{28596, "iso-8859-6"}, /* ISO 8859-6 Arabic */
443-
{28596, "iso8859-6"}, /* ISO 8859-6 Arabic */
444-
{28596, "iso_8859-6"},
445-
{28596, "iso_8859_6"},
446-
{28597, "iso-8859-7"}, /* ISO 8859-7 Greek */
447-
{28597, "iso8859-7"}, /* ISO 8859-7 Greek */
448-
{28597, "iso_8859-7"},
449-
{28597, "iso_8859_7"},
450-
{28598, "iso-8859-8"}, /* ISO 8859-8 Hebrew; Hebrew (ISO-Visual) */
451-
{28598, "iso8859-8"}, /* ISO 8859-8 Hebrew; Hebrew (ISO-Visual) */
452-
{28598, "iso_8859-8"},
453-
{28598, "iso_8859_8"},
454-
{28599, "iso-8859-9"}, /* ISO 8859-9 Turkish */
455-
{28599, "iso8859-9"}, /* ISO 8859-9 Turkish */
456-
{28599, "iso_8859-9"},
457-
{28599, "iso_8859_9"},
458-
{28603, "iso-8859-13"}, /* ISO 8859-13 Estonian */
459-
{28603, "iso8859-13"}, /* ISO 8859-13 Estonian */
460-
{28603, "iso_8859-13"},
461-
{28603, "iso_8859_13"},
462-
{28605, "iso-8859-15"}, /* ISO 8859-15 Latin 9 */
463-
{28605, "iso8859-15"}, /* ISO 8859-15 Latin 9 */
464-
{28605, "iso_8859-15"},
465-
{28605, "iso_8859_15"},
420+
{21866, "KOI8-U"}, /* Ukrainian (KOI8-U); Cyrillic (KOI8-U) */
421+
{28591, "ISO-8859-1"}, /* ISO 8859-1 Latin 1; Western European (ISO) */
422+
{28591, "ISO8859-1"}, /* ISO 8859-1 Latin 1; Western European (ISO) */
423+
{28591, "ISO_8859-1"},
424+
{28591, "ISO_8859_1"},
425+
{28592, "ISO-8859-2"}, /* ISO 8859-2 Central European; Central European (ISO) */
426+
{28592, "ISO8859-2"}, /* ISO 8859-2 Central European; Central European (ISO) */
427+
{28592, "ISO_8859-2"},
428+
{28592, "ISO_8859_2"},
429+
{28593, "ISO-8859-3"}, /* ISO 8859-3 Latin 3 */
430+
{28593, "ISO8859-3"}, /* ISO 8859-3 Latin 3 */
431+
{28593, "ISO_8859-3"},
432+
{28593, "ISO_8859_3"},
433+
{28594, "ISO-8859-4"}, /* ISO 8859-4 Baltic */
434+
{28594, "ISO8859-4"}, /* ISO 8859-4 Baltic */
435+
{28594, "ISO_8859-4"},
436+
{28594, "ISO_8859_4"},
437+
{28595, "ISO-8859-5"}, /* ISO 8859-5 Cyrillic */
438+
{28595, "ISO8859-5"}, /* ISO 8859-5 Cyrillic */
439+
{28595, "ISO_8859-5"},
440+
{28595, "ISO_8859_5"},
441+
{28596, "ISO-8859-6"}, /* ISO 8859-6 Arabic */
442+
{28596, "ISO8859-6"}, /* ISO 8859-6 Arabic */
443+
{28596, "ISO_8859-6"},
444+
{28596, "ISO_8859_6"},
445+
{28597, "ISO-8859-7"}, /* ISO 8859-7 Greek */
446+
{28597, "ISO8859-7"}, /* ISO 8859-7 Greek */
447+
{28597, "ISO_8859-7"},
448+
{28597, "ISO_8859_7"},
449+
{28598, "ISO-8859-8"}, /* ISO 8859-8 Hebrew; Hebrew (ISO-Visual) */
450+
{28598, "ISO8859-8"}, /* ISO 8859-8 Hebrew; Hebrew (ISO-Visual) */
451+
{28598, "ISO_8859-8"},
452+
{28598, "ISO_8859_8"},
453+
{28599, "ISO-8859-9"}, /* ISO 8859-9 Turkish */
454+
{28599, "ISO8859-9"}, /* ISO 8859-9 Turkish */
455+
{28599, "ISO_8859-9"},
456+
{28599, "ISO_8859_9"},
457+
{28603, "ISO-8859-13"}, /* ISO 8859-13 Estonian */
458+
{28603, "ISO8859-13"}, /* ISO 8859-13 Estonian */
459+
{28603, "ISO_8859-13"},
460+
{28603, "ISO_8859_13"},
461+
{28605, "ISO-8859-15"}, /* ISO 8859-15 Latin 9 */
462+
{28605, "ISO8859-15"}, /* ISO 8859-15 Latin 9 */
463+
{28605, "ISO_8859-15"},
464+
{28605, "ISO_8859_15"},
466465
{29001, "x-Europa"}, /* Europa 3 */
467-
{38598, "iso-8859-8-i"}, /* ISO 8859-8 Hebrew; Hebrew (ISO-Logical) */
468-
{38598, "iso8859-8-i"}, /* ISO 8859-8 Hebrew; Hebrew (ISO-Logical) */
469-
{38598, "iso_8859-8-i"},
470-
{38598, "iso_8859_8-i"},
471-
{50220, "iso-2022-jp"}, /* ISO 2022 Japanese with no halfwidth Katakana; Japanese (JIS) */
466+
{38598, "ISO-8859-8-I"}, /* ISO 8859-8 Hebrew; Hebrew (ISO-Logical) */
467+
{38598, "ISO8859-8-I"}, /* ISO 8859-8 Hebrew; Hebrew (ISO-Logical) */
468+
{38598, "ISO_8859-8-I"},
469+
{38598, "ISO_8859_8-I"},
470+
{50220, "ISO-2022-JP"}, /* ISO 2022 Japanese with no halfwidth Katakana; Japanese (JIS) */
472471
{50221, "csISO2022JP"}, /* ISO 2022 Japanese with halfwidth Katakana; Japanese (JIS-Allow 1 byte Kana) */
473-
{50222, "iso-2022-jp"}, /* ISO 2022 Japanese JIS X 0201-1989; Japanese (JIS-Allow 1 byte Kana - SO/SI) */
474-
{50225, "iso-2022-kr"}, /* ISO 2022 Korean */
475-
{50225, "iso2022-kr"}, /* ISO 2022 Korean */
472+
{50222, "ISO-2022-JP"}, /* ISO 2022 Japanese JIS X 0201-1989; Japanese (JIS-Allow 1 byte Kana - SO/SI) */
473+
{50225, "ISO-2022-KR"}, /* ISO 2022 Korean */
474+
{50225, "ISO2022-KR"}, /* ISO 2022 Korean */
476475
{50227, "x-cp50227"}, /* ISO 2022 Simplified Chinese; Chinese Simplified (ISO 2022) */
477476
/* 50229 ISO 2022 Traditional Chinese */
478477
/* 50930 EBCDIC Japanese (Katakana) Extended */
@@ -482,11 +481,11 @@ static struct {
482481
/* 50936 EBCDIC Simplified Chinese */
483482
/* 50937 EBCDIC US-Canada and Traditional Chinese */
484483
/* 50939 EBCDIC Japanese (Latin) Extended and Japanese */
485-
{51932, "euc-jp"}, /* EUC Japanese */
484+
{51932, "EUC-JP"}, /* EUC Japanese */
486485
{51936, "EUC-CN"}, /* EUC Simplified Chinese; Chinese Simplified (EUC) */
487-
{51949, "euc-kr"}, /* EUC Korean */
486+
{51949, "EUC-KR"}, /* EUC Korean */
488487
/* 51950 EUC Traditional Chinese */
489-
{52936, "hz-gb-2312"}, /* HZ-GB2312 Simplified Chinese; Chinese Simplified (HZ) */
488+
{52936, "HZ-GB-2312"}, /* HZ-GB2312 Simplified Chinese; Chinese Simplified (HZ) */
490489
{54936, "GB18030"}, /* Windows XP and later: GB18030 Simplified Chinese (4 byte); Chinese Simplified (GB18030) */
491490
{57002, "x-iscii-de"}, /* ISCII Devanagari */
492491
{57003, "x-iscii-be"}, /* ISCII Bengali */
@@ -523,7 +522,7 @@ static REBINT get_codepage_id(REBVAL *cp)
523522
else if ('0' <= name[0] && name[0] <= '9')
524523
return atoi(cs_cast(name)); /* 123 */
525524

526-
for (i = 0; codepage_alias[i].name != NULL; ++i)
525+
for (i = 0; codepage_alias[i].name != NULL; i++)
527526
if (_stricmp(cs_cast(name), codepage_alias[i].name) == 0)
528527
return codepage_alias[i].codepage;
529528
#else
@@ -532,9 +531,10 @@ static REBINT get_codepage_id(REBVAL *cp)
532531
else if ('0' <= name[0] && name[0] <= '9')
533532
return atoi(cs_cast(name)); /* 123 */
534533

535-
for (i = 0; codepage_alias[i].name != NULL; ++i)
534+
for (i = 0; codepage_alias[i].name != NULL; i++) {
536535
if (strcasecmp(cs_cast(name), codepage_alias[i].name) == 0)
537536
return codepage_alias[i].codepage;
537+
}
538538
#endif
539539
return -1;
540540
}
@@ -554,7 +554,7 @@ static REBYTE* get_codepage_name(REBVAL *cp)
554554

555555
//printf("get_codepage_name from: %d\n", id);
556556

557-
for (i = 0; codepage_alias[i].name != NULL; ++i) {
557+
for (i = 0; codepage_alias[i].name != NULL; i++) {
558558
if (codepage_alias[i].codepage == id) {
559559
// printf("found: %s\n", codepage_alias[i].name);
560560
return (REBYTE*)codepage_alias[i].name;
@@ -577,6 +577,27 @@ static REBYTE* get_codepage_name(REBVAL *cp)
577577
data[i] = (num>>8) | (num<<8);
578578
}
579579
}
580+
#else
581+
/***********************************************************************
582+
** Some iconv versions accepts only some names!
583+
** For example on BSD `UTF-8` is accepted, but not `UTF8`.
584+
** This function converts the input into numeric ID (as used on Windows)
585+
** and than back to name, where prefered (supported) name should be first.
586+
**
587+
*/ static REBYTE* norm_codepage_name(REBVAL *cp)
588+
/*
589+
***********************************************************************/
590+
{
591+
REBINT id;
592+
REBYTE *name;
593+
id = get_codepage_id(cp);
594+
if (id == -1) return NULL;
595+
for(int i = 0; codepage_alias[i].name != NULL; i++) {
596+
if(codepage_alias[i].codepage == id)
597+
return (REBYTE*)codepage_alias[i].name;
598+
}
599+
return NULL;
600+
}
580601
#endif
581602

582603
/***********************************************************************
@@ -720,13 +741,20 @@ static REBYTE* get_codepage_name(REBVAL *cp)
720741
size_t dst_size;
721742
size_t nread;
722743
REBCNT tail;
723-
const char *fromcode = cs_cast(get_codepage_name(val_from));
744+
745+
//TODO: currently only strings regisered in the aliases are supported
746+
// but iconv may support more variants, so we could try to convert
747+
// any given codepage names, and do normalization only when it fails!
748+
749+
const char *fromcode = cs_cast(norm_codepage_name(val_from));
724750
const char *tocode;
725751
int wide;
726752

727-
if (!fromcode) Trap1(RE_INVALID_ARG, val_from);
753+
if (!fromcode) {
754+
Trap1(RE_INVALID_ARG, val_from);
755+
}
728756
if (ref_to) {
729-
tocode = cs_cast(get_codepage_name(val_to));
757+
tocode = cs_cast(norm_codepage_name(val_to));
730758
if (!tocode) Trap1(RE_INVALID_ARG, val_to);
731759
wide = 1; // result is raw binary series
732760
} else {
@@ -737,7 +765,7 @@ static REBYTE* get_codepage_name(REBVAL *cp)
737765
cd = iconv_open(tocode, fromcode);
738766
if (cd == (iconv_t)-1) {
739767
if (get_codepage_id(val_from) < 0) Trap1(RE_INVALID_ARG, val_from);
740-
if (get_codepage_id(val_to) < 0) Trap1(RE_INVALID_ARG, val_to);
768+
if (ref_to && get_codepage_id(val_to) < 0) Trap1(RE_INVALID_ARG, val_to);
741769
Trap0(RE_FEATURE_NA);
742770
}
743771

src/tests/units/series-test.r3

+9
Original file line numberDiff line numberDiff line change
@@ -1476,6 +1476,15 @@ Rebol [
14761476
;--assert txt = iconv #{FFFE50005901690068006C00E100730069007400} 'UTF16
14771477
--assert (next txt) = iconv next #{50F869686CE1736974} 28592
14781478

1479+
--test-- "ICONV from UTF-8"
1480+
;@@ https://github.com/Oldes/Rebol-issues/issues/2475
1481+
--assert "š" = iconv #{C5A1} 'utf8
1482+
--assert "š" = iconv #{C5A1} 'utf-8
1483+
--assert "š" = iconv #{C5A1} 'UTF8
1484+
--assert "š" = iconv #{C5A1} 'UTF-8
1485+
--assert "š" = iconv #{C5A1} 'CP65001
1486+
--assert "š" = iconv #{C5A1} 65001
1487+
14791488
--test-- "ICONV with empty imput"
14801489
--assert "" = iconv #{} 28592
14811490
--assert "" = iconv #{} 'utf8

0 commit comments

Comments
 (0)