For the record, here is the answer sent by mail: Alexander Kogtenkov from EiffelSoftware is also suggesting to replace this code: create string_array.make_from_special(string.as_string_32.area) create natural_16_array.make_filled (0, string_array.lower, string_array.upper) from i := string_array.lower until i > string_array.upper loop integer := string_array.item(i).code natural_16_array.put(integer.as_natural_16, i) -- forth i := i + 1 end a_string := natural_16_array.to_c with a_string := {UTF_CONVERTER}.string_32_to_utf_16_0 (string.as_string32) This code will make sure that a_string is 0-terminated Unicode code points above 0xFFFF (for examples, for emoji) are correctly translated into UTF-16 surrogate pairs it is more efficient than the original If string is in UTF-32, even simpler (and even more efficient code) is possible: a_string := {UTF_CONVERTER}.utf_32_string_to_utf_16_0 (string) Note that in that case, there is no need to perform conversion and to call as_string_32, because utf_32_string_to_utf_16_0 accepts READABLE_STRING_GENERAL. --- Closing this report.