write UTF-16 string data, converting to UTF-8 or using native encoding
| 66 | |
| 67 | /// write UTF-16 string data, converting to UTF-8 or using native encoding |
| 68 | inline void write_u16string_data(const char16_t *data, size_t size, |
| 69 | WriteContext &ctx) { |
| 70 | if (size == 0) { |
| 71 | // Empty string: write zero length with UTF8 encoding |
| 72 | ctx.write_var_uint36_small(static_cast<uint64_t>(StringEncoding::UTF8)); |
| 73 | return; |
| 74 | } |
| 75 | |
| 76 | const uint16_t *u16_data = reinterpret_cast<const uint16_t *>(data); |
| 77 | |
| 78 | // Check if string can be encoded as Latin1 (more compact) |
| 79 | if (is_latin1(u16_data, size)) { |
| 80 | // encode as Latin1 for compactness |
| 81 | uint64_t size_with_encoding = (static_cast<uint64_t>(size) << 2) | |
| 82 | static_cast<uint64_t>(StringEncoding::LATIN1); |
| 83 | ctx.write_var_uint36_small(size_with_encoding); |
| 84 | |
| 85 | // write each char16_t as a single byte |
| 86 | for (size_t i = 0; i < size; ++i) { |
| 87 | ctx.write_uint8(static_cast<uint8_t>(data[i])); |
| 88 | } |
| 89 | } else { |
| 90 | // Convert to UTF-8 |
| 91 | std::string utf8 = utf16_to_utf8(u16_data, size); |
| 92 | uint64_t size_with_encoding = (static_cast<uint64_t>(utf8.size()) << 2) | |
| 93 | static_cast<uint64_t>(StringEncoding::UTF8); |
| 94 | ctx.write_var_uint36_small(size_with_encoding); |
| 95 | if (!utf8.empty()) { |
| 96 | ctx.write_bytes(utf8.data(), utf8.size()); |
| 97 | } |
| 98 | } |
| 99 | } |
| 100 | |
| 101 | /// Read string data and return as std::string |
| 102 | inline std::string read_string_data(ReadContext &ctx) { |
no test coverage detected