6 let u = try Netconversion.makechar (enc :> Netconversion.encoding) i
7 with Not_found -> "" in
13 let make_ucs2 start stop =
14 let s = String.create ((stop - start) * 2) in
15 for i = 0 to stop-start-1 do
18 s.[k] <- Char.chr(c lsr 8);
19 s.[k+1] <- Char.chr(c land 0xff);
24 let make_ucs4 start stop =
25 let s = String.create ((stop - start) * 4) in
26 for i = 0 to stop-start-1 do
29 s.[k] <- Char.chr(c lsr 24);
30 s.[k+1] <- Char.chr((c lsr 16) land 0xff);
31 s.[k+2] <- Char.chr((c lsr 8) land 0xff);
32 s.[k+3] <- Char.chr(c land 0xff);
37 let name_of_encoding enc =
39 `Enc_iso88591 -> "ISO_8859-1"
40 | `Enc_iso88592 -> "ISO_8859-2"
41 | `Enc_iso88593 -> "ISO_8859-3"
42 | `Enc_iso88594 -> "ISO_8859-4"
43 | `Enc_iso88595 -> "ISO_8859-5"
44 | `Enc_iso88596 -> "ISO_8859-6"
45 | `Enc_iso88597 -> "ISO_8859-7"
46 | `Enc_iso88598 -> "ISO_8859-8"
47 | `Enc_iso88599 -> "ISO_8859-9"
48 | `Enc_iso885910 -> "ISO_8859-10"
49 | `Enc_iso885913 -> "ISO_8859-13"
50 | `Enc_iso885914 -> "ISO_8859-14"
51 | `Enc_iso885915 -> "ISO_8859-15"
52 | `Enc_utf8 -> "UTF-8"
53 | `Enc_ucs4 -> "UCS-4"
54 | `Enc_ucs2 -> "UCS-2"
55 | `Enc_utf16 -> "UTF-16"
57 (* Note: GNU-iconv assumes big endian byte order *)
60 let iconv_recode_string in_enc out_enc in_s =
61 let in_enc_name = name_of_encoding in_enc in
62 let out_enc_name = name_of_encoding out_enc in
65 let out_ch,in_ch = Unix.open_process ("iconv -f " ^ in_enc_name ^ " -t " ^
67 (* Write in_s to in_ch in a new thread: *)
71 output_string in_ch in_s;
76 (* Read the result in the current thread: *)
77 let buf = String.create 1024 in
80 let n' = input out_ch buf 0 1024 in
81 out_s := !out_s ^ String.sub buf 0 n';
84 ignore(Unix.close_process (out_ch,in_ch));
88 let test_iso_and_utf8 enc =
89 let name = name_of_encoding enc in
90 print_string ("Recode: " ^ name ^ " and UTF-8... "); flush stdout;
91 let s = make_iso enc in
92 let s1' = Netconversion.recode_string (enc :> Netconversion.encoding)
94 let s2' = iconv_recode_string enc `Enc_utf8 s in
96 let s1 = Netconversion.recode_string `Enc_utf8
97 (enc :> Netconversion.encoding) s1' in
98 let s2 = iconv_recode_string `Enc_utf8 enc s1' in
99 assert(s1 = s2 && s1 = s);
100 print_endline "OK"; flush stdout
103 let test_utf16_and_utf8_0000_d7ff () =
104 print_string "Recode: UTF-16-BE and UTF-8, #0000-#D7FF... ";
106 let s = make_ucs2 0 0xd800 in
107 let s1' = Netconversion.recode_string `Enc_utf16_be `Enc_utf8 s in
108 let s2' = iconv_recode_string `Enc_utf16 `Enc_utf8 s in
110 let s1 = Netconversion.recode_string `Enc_utf8 `Enc_utf16_be s1' in
111 let s2 = iconv_recode_string `Enc_utf8 `Enc_utf16 s1' in
112 assert(s1 = s2 && s1 = s);
113 print_endline "OK"; flush stdout
116 let test_utf16_and_utf8_e000_fffd () =
117 print_string "Recode: UTF-16-BE and UTF-8, #E000-#FFFD... ";
119 let s = make_ucs2 0xe000 0xfffe in
120 let s1' = Netconversion.recode_string `Enc_utf16_be `Enc_utf8 s in
121 let s2' = iconv_recode_string `Enc_utf16 `Enc_utf8 s in
123 let s1 = Netconversion.recode_string `Enc_utf8 `Enc_utf16_be s1' in
124 let s2 = iconv_recode_string `Enc_utf8 `Enc_utf16 s1' in
125 assert(s1 = s2 && s1 = s);
126 print_endline "OK"; flush stdout
129 let test_utf16_and_utf8_10000_10FFFF () =
130 print_string "Recode: UTF-16-BE and UTF-8, #10000-#10FFFF... ";
133 let s0 = make_ucs4 (i * 0x10000) (i * 0x10000 + 0x10000) in
134 let s = iconv_recode_string `Enc_ucs4 `Enc_utf16 s0 in
135 let s1' = Netconversion.recode_string `Enc_utf16_be `Enc_utf8 s in
136 let s2' = iconv_recode_string `Enc_utf16 `Enc_utf8 s in
138 let s1 = Netconversion.recode_string `Enc_utf8 `Enc_utf16_be s1' in
139 let s2 = iconv_recode_string `Enc_utf8 `Enc_utf16 s1' in
140 assert(s1 = s2 && s1 = s);
141 print_string "+"; flush stdout;
143 print_endline "OK"; flush stdout
147 print_endline "Warning: You need the command 'iconv' to run this test!";
149 test_iso_and_utf8 `Enc_iso88591;
150 test_iso_and_utf8 `Enc_iso88592;
151 test_iso_and_utf8 `Enc_iso88593;
152 test_iso_and_utf8 `Enc_iso88594;
153 test_iso_and_utf8 `Enc_iso88595;
154 test_iso_and_utf8 `Enc_iso88596;
155 test_iso_and_utf8 `Enc_iso88597;
156 (* test_iso_and_utf8 `Enc_iso88598; *)
157 test_iso_and_utf8 `Enc_iso88599;
158 test_iso_and_utf8 `Enc_iso885910;
159 (* test_iso_and_utf8 `Enc_iso885913; *)
160 (* test_iso_and_utf8 `Enc_iso885914; *)
161 (* test_iso_and_utf8 `Enc_iso885915; *)
162 test_utf16_and_utf8_0000_d7ff();
163 test_utf16_and_utf8_e000_fffd();
164 (* This test does not work because iconv does not support the surrogate
165 * representation of UTF-16:
166 * test_utf16_and_utf8_10000_10FFFF();