Одним из частых случаев использования, которые обрабатывает моя библиотека, является чтение строк (с нулевым завершением) из собственной памяти. Для большинства приложений *nix это «Строки C», и для этой задачи достаточно метода MemorySegment.getUtf8String().
Однако собственные строки Windows хранятся в UTF-16 (LE). Называемые массивами TCHAR или «широкими строками», они обрабатываются аналогично «строкам C», за исключением того, что они занимают по 2 байта каждая.
JNA предоставляет для этой цели метод Native.getWideString(), который вызывает собственный код для эффективного перебора соответствующего набора символов.
Я не вижу эквивалента UTF-16 для getUtf8String() (и соответствующий набор...()), оптимизированный для этих приложений на базе Windows.
Я могу обойти эту проблему несколькими подходами:
- Если я читаю из буфера фиксированного размера, я могу создать новую строку (bytes, StandardCharsets.UTF_16LE) и:
Если я знаю, что память была очищается перед заполнением, используйте обрезку() - В противном случае Split() на нулевом разделителе и извлекайте первый элемент
Хотя я, конечно, не ожидал, что JDK предоставит собственные реализации для каждого набора символов, я думаю, что Windows представляет собой достаточно значительную долю использования, чтобы поддерживать свою основную собственную кодировку наряду с удобными методами UTF-8. Есть ли способ сделать это, который я еще не обнаружил? Или есть какие-нибудь лучшие альтернативы, чем новый String() или подходы к символьной итерации, которые я описал?
Подробнее здесь: https://stackoverflow.com/questions/742 ... for-utf-16
Мобильная версия