Как я могу хранить все «символы» UTF-16 в базе данных Postgres?
Короткий ответ: это невозможно напрямую, поскольку PostgreSQL поддерживает только набор символов UTF-8.
Форматы на основе UTF-16, такие как Java, JavaScript, Windows, могут содержать полусуррогатные пары, которые не представлены в UTF-8 или UTF-32. Их можно легко создать путем подстроки строки Java, JavaScript, VB.Net. Поскольку они не могут быть представлены в UTF-8 или UTF-32 и, следовательно, не могут храниться в базе данных, которая поддерживает только набор символов UTF-8, например PostgreSQL.
Имена путей Windows могут содержать половину суррогатных пар, которые не могут быть прочитаны как utf-8 ( https://github.com/rust-lang/rust/issues/12056).
Придется использовать систему баз данных, которая поддерживает набор символов UTF-16/CESU-8, который более адаптирован к языкам/платформам Java/Android, JavaScript/NodeJS, .Net/wchar_t/Windows. (SQLServer, Oracle (сопоставление UTF-8), DB2, Informix, HANA, SQL Anywhere, MaxDB обычно поддерживают такую кодировку.
Обратите внимание, что поскольку смайлики представлены в виде кодовых точек Unicode за пределами базовой многоязычной плоскости, эти различия станут более актуальными и для западных пользователей.
В postgres вы можете: а) принять потери, б) сохранить данные как двоичные данные или в) преобразовать их в закодированное представление (например, JSON rfc кодирует их как два экранированных символа, чтобы иметь возможность передавать половину суррогатов в UTF- 8/Сетевой формат на основе Ascii без потерь (https://tools.ietf.org/html/rfc4627 а> Раздел 2.5).
Например, поскольку смайлики находятся вне базовой многоязычной плоскости, эта проблема станет более актуальной и в западном мире.
В зависимости от выбора языка Application Server (Java, Scala, C#/Windows, JavaScript/NodeJS) и уровня инвестиций в языковую поддержку (например, с использованием функций разделения строк ICU на границах графемы (https:/)/www.unicode.org/reports/tr29/#Grapheme_Cluster_Boundaries) вместо простого усечения проблема может быть менее актуально, но большинство корпоративных систем и языков сегодня относятся к лагерю UTF-16, а программное обеспечение использует простые операции с подстроками.
person
user6649841
schedule
15.12.2018