utf_16_to_utf_8/
utf_16_to_utf_8.rs

1pub fn utf_16_to_utf_8(input: &[u16], output_count: &mut usize, output: &mut [u8]) -> bool {
2    let mut code_unit_1: u16;
3    let mut code_unit_2: u16;
4    let mut code_point: u32;
5    let mut i: usize;
6    let mut j: usize = 0;
7    let mut is_reverse_byte_order: bool;
8    let mut is_valid = true;
9
10    if input.len() != 0 {
11        i = 0;
12        is_reverse_byte_order = false;
13
14        if
15            input[0] == 0xFEFF ||
16            input[0] == 0xFFFE
17        {
18            i = 1;
19
20            if input[0] == 0xFFFE {
21                is_reverse_byte_order = true;
22            }
23        }
24
25        while
26            is_valid == true &&
27            i != input.len()
28        {
29            if is_reverse_byte_order == true {
30                code_unit_1 = (input[i] << 8) + (input[i] >> 8);
31            } else {
32                code_unit_1 = input[i];
33            }
34
35            if
36                code_unit_1 > 55295 &&
37                code_unit_1 < 57344
38            {
39                if code_unit_1 < 56320 {
40                    i += 1;
41
42                    if i != input.len() {
43                        if is_reverse_byte_order == true {
44                            code_unit_2 = (input[i] << 8) + (input[i] >> 8);
45                        } else {
46                            code_unit_2 = input[i];
47                        }
48
49                        if
50                            code_unit_2 > 56319 &&
51                            code_unit_2 < 57344
52                        {
53                            code_point = (((code_unit_1 & 1023) as u32) << 10) + ((code_unit_2 & 1023) as u32) + 65536;
54                            output[j] = ((code_point >> 18) + 240) as u8;
55                            j += 1;
56                            output[j] = (((code_point >> 12) & 63) + 128) as u8;
57                            j += 1;
58                            output[j] = (((code_point >> 6) & 63) + 128) as u8;
59                            j += 1;
60                            output[j] = ((code_point & 63) + 128) as u8;
61                        } else {
62                            is_valid = false;
63                        }
64                    } else {
65                        is_valid = false;
66                    }
67                } else {
68                    is_valid = false;
69                }
70            } else {
71                if code_unit_1 < 128 {
72                    output[j] = code_unit_1 as u8;
73                } else {
74                    if code_unit_1 < 2048 {
75                        output[j] = ((code_unit_1 >> 6) + 192) as u8;
76                        j += 1;
77                        output[j] = ((code_unit_1 & 63) + 128) as u8;
78                    } else {
79                        output[j] = ((code_unit_1 >> 12) + 224) as u8;
80                        j += 1;
81                        output[j] = (((code_unit_1 >> 6) & 63) + 128) as u8;
82                        j += 1;
83                        output[j] = ((code_unit_1 & 63) + 128) as u8;
84                    }
85                }
86            }
87
88            i += 1;
89            j += 1;
90        }
91    }
92
93    *output_count = j;
94    return is_valid;
95}
96
97pub fn utf_16_be_to_utf_8(input: &[u16], output_count: &mut usize, output: &mut [u8]) -> bool {
98    let mut code_point: u32;
99    let mut i: usize;
100    let mut j: usize = 0;
101    let mut is_valid = true;
102
103    if input.len() != 0 {
104        i = 0;
105
106        while
107            is_valid == true &&
108            i != input.len()
109        {
110            if
111                input[i] > 55295 &&
112                input[i] < 57344
113            {
114                if input[i] < 56320 {
115                    i += 1;
116
117                    if i != input.len() {
118                        if
119                            input[i] > 56319 &&
120                            input[i] < 57344
121                        {
122                            code_point = (((input[i - 1] & 1023) as u32) << 10) + ((input[i] & 1023) as u32) + 65536;
123                            output[j] = ((code_point >> 18) + 240) as u8;
124                            j += 1;
125                            output[j] = (((code_point >> 12) & 63) + 128) as u8;
126                            j += 1;
127                            output[j] = (((code_point >> 6) & 63) + 128) as u8;
128                            j += 1;
129                            output[j] = ((code_point & 63) + 128) as u8;
130                        } else {
131                            is_valid = false;
132                        }
133                    } else {
134                        is_valid = false;
135                    }
136                } else {
137                    is_valid = false;
138                }
139            } else {
140                if input[i] < 128 {
141                    output[j] = input[i] as u8;
142                } else {
143                    if input[i] < 2048 {
144                        output[j] = ((input[i] >> 6) + 192) as u8;
145                        j += 1;
146                        output[j] = ((input[i] & 63) + 128) as u8;
147                    } else {
148                        output[j] = ((input[i] >> 12) + 224) as u8;
149                        j += 1;
150                        output[j] = (((input[i] >> 6) & 63) + 128) as u8;
151                        j += 1;
152                        output[j] = ((input[i] & 63) + 128) as u8;
153                    }
154                }
155            }
156
157            i += 1;
158            j += 1;
159        }
160    }
161
162    *output_count = j;
163    return is_valid;
164}
165
166pub fn utf_16_le_to_utf_8(input: &[u16], output_count: &mut usize, output: &mut [u8]) -> bool {
167    let mut code_unit_1: u16;
168    let mut code_unit_2: u16;
169    let mut code_point: u32;
170    let mut i: usize;
171    let mut j: usize = 0;
172    let mut is_valid = true;
173
174    if input.len() != 0 {
175        i = 0;
176
177        while
178            is_valid == true &&
179            i != input.len()
180        {
181            code_unit_1 = (input[i] << 8) + (input[i] >> 8);
182
183            if
184                code_unit_1 > 55295 &&
185                code_unit_1 < 57344
186            {
187                if code_unit_1 < 56320 {
188                    i += 1;
189
190                    if i != input.len() {
191                        code_unit_2 = (input[i] << 8) + (input[i] >> 8);
192
193                        if
194                            code_unit_2 > 56319 &&
195                            code_unit_2 < 57344
196                        {
197                            code_point = (((code_unit_1 & 1023) as u32) << 10) + ((code_unit_2 & 1023) as u32) + 65536;
198                            output[j] = ((code_point >> 18) + 240) as u8;
199                            j += 1;
200                            output[j] = (((code_point >> 12) & 63) + 128) as u8;
201                            j += 1;
202                            output[j] = (((code_point >> 6) & 63) + 128) as u8;
203                            j += 1;
204                            output[j] = ((code_point & 63) + 128) as u8;
205                        } else {
206                            is_valid = false;
207                        }
208                    } else {
209                        is_valid = false;
210                    }
211                } else {
212                    is_valid = false;
213                }
214            } else {
215                if code_unit_1 < 128 {
216                    output[j] = code_unit_1 as u8;
217                } else {
218                    if code_unit_1 < 2048 {
219                        output[j] = ((code_unit_1 >> 6) + 192) as u8;
220                        j += 1;
221                        output[j] = ((code_unit_1 & 63) + 128) as u8;
222                    } else {
223                        output[j] = ((code_unit_1 >> 12) + 224) as u8;
224                        j += 1;
225                        output[j] = (((code_unit_1 >> 6) & 63) + 128) as u8;
226                        j += 1;
227                        output[j] = ((code_unit_1 & 63) + 128) as u8;
228                    }
229                }
230            }
231
232            i += 1;
233            j += 1;
234        }
235    }
236
237    *output_count = j;
238    return is_valid;
239}