Как обстоят дела с юникод-символом 首 (U + 9996) и как java / mysql справляется с ним и его друзьями? - PullRequest
4 голосов
/ 05 декабря 2008

У меня есть строка Java, которая содержит символ Unicode U + 9996 (это то, что я получаю, если я делаю codePointAt ()).

Если я посмотрю на панель выражений отладчика (в eclipse), то все будет хорошо, и это выглядит как "". Однако, если я распечатываю это на консоль, я получаю просто "? ". Кажется, проблема не в шрифте, потому что я пытался установить его по-другому.

Моя настоящая проблема в том, что я пытаюсь поместить строку в базу данных MySQL (с кодировкой utf8). Многие другие широкие символы хорошо отображаются в БД, но, опять же, этот и некоторые другие, как он, отображаются как «?». Все это заставляет меня поверить, что проблема на стороне Java.

В погоне за этой ошибкой я немного узнал о Нормализации Unicode и java.text. Нормализатор , который выглядит так, как будто это может быть уместно в этом случае. Я узнал, что U + 9996 - это каноническая версия U + 2FB8. U + 2FB8 имеет точно такие же проблемы, что и выше, хотя в отношении отображения, и в любом случае, почему я хотел бы преобразовать в неканоническое представление (даже если бы я мог, что я не думаю, что смогу)?

В любом случае, я нашел одну потенциальную подсказку, которую я не смог понять. Эта страница содержит слова "U + 9996 не является допустимым символом Unicode" без дальнейшего объяснения. Затем он продолжает показывать, как кодировать этот предположительно недопустимый символ Unicode в различных кодировках Unicode. Так что мой вопрос в основном это: WTF?


ОБНОВЛЕНИЕ

  • Я на Mac.
  • Я говорю о консоли Eclipse.
    • Я установил кодировку консоли на UTF-8 в разделе «Выполнить»> «Общий»
    • Я добавил -Dfile.encoding=UTF-8 к аргументам JVM (по умолчанию был MacRoman)
    • Консоль (Eclipse и Terminal.app) теперь показывает правильные символы. Ура!
  • Меня больше всего интересует правильное поступление данных в базу данных, хотя, конечно, я бы хотел получить полное представление о том, что здесь происходит.
  • Мне кажется, я исправил проблему с базой данных. Я забыл установить кодировку для соединения . Теперь я не понимаю, почему некоторые азиатские персонажи проходили, а другие нет.
  • Фу, стекопоток движется быстро. Сложно не отставать. Спасибо людям.

Ответы [ 3 ]

2 голосов
/ 05 декабря 2008

Проверено ли, что значение, которое хранится в базе данных, на самом деле является U + 003f (знак вопроса)? Существуют различные соглашения о том, как отображать символы, которых нет в выбранном шрифте, и отображать их как? довольно распространено.

Так что, скорее всего, персонаж хранится правильно и по каким-либо причинам просто отображается как «?». По сути, игнорируйте то, как он отображается, и посмотрите, какая кодовая точка хранится в базе данных. Это U + 9996 или U + 003f (или что-то еще полностью)? Не думайте вслепую, что только потому, что он отображается как знак вопроса, на самом деле это знак вопроса, который хранится в базе данных.

0 голосов
/ 05 декабря 2008
  1. На каком O / S это работает?
  2. Что такое консольное приложение (xterm, cmd.exe и т. Д.?)
  3. Установлено ли консольное приложение для вывода UTF-8?

Относительно 3 выше, который, вероятно, является важным, я видел похожие проблемы, например, с помощью. PuTTY, чтобы поговорить с боксом Linux, где бокс Linux думал, что я на UTF-8, но сам сеанс PuTTY был установлен на ISO-Latin-1 (8859-1)

0 голосов
/ 05 декабря 2008

Я не знаю о проблемах, но это , безусловно, действительный символ Unicode (и был с Unicode 1.1).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...