Любопытный случай дефиса и тире - PullRequest
4 голосов
/ 10 августа 2010

Я пытаюсь получить записи из базы данных Oracle 9i со значением 'FOO-BAR' для определенного столбца.

Значения условия 'FOO - BAR' присутствуют в таблице, но когда я запускаю запрос, результаты не приходят.

После того, как я сломал себе голову, понял, что есть разница в размерах гипса.

'FOO – BAR'
'FOO - BAR'

На этот раз я скопировал (через SQLDeveloper) значение БД и вставил его в Eclipse IDE. Я не видел никакой разницы в Затмении. Когда я запустил запрос из IDE, к моему удивлению, он сработал, и значения пришли.

Я развернул тот же файл класса на наших серверах (окно UX) и снова вернулся к квадрату № 1 - значения не приходят.

Я попытался изменить кодировку файла моей IDE со значения по умолчанию (Cp1252) на UTF-8, и теперь все в порядке.

Может кто-нибудь объяснить, что происходит? Будет ли размер дефиса меняться в зависимости от кодировки? у нас есть три различных видов тире?

Ответы [ 4 ]

5 голосов
/ 10 августа 2010

Существует множество различных символов Unicode для em-dash, en-dash, дефис и т. Д. Они используются в тексте в разных контекстах.

Вы можете прочитать статью "Dash" в википедии для получения дополнительной информации. Обратите внимание, что дефис не совсем то же самое:)

Что касается того, как кодировки входят в вещи - это будет зависеть от того, как вы вставляете, извлекаете и затем отображаете данные. Я бы не стал использовать метод «вырезать и вставить» - он вполне может попытаться найти наиболее близкое доступное значение к фактическим данным, представленным в базе данных.

3 голосов
/ 10 августа 2010

У нас есть три вида штрихов?

Да. На самом деле, в зависимости от того, что именно вы считаете за тире, существует много более 3-х кодовых точек Юникода для дефисов и тире. (А на странице, на которую ссылается @Jon Skeet, нет даже списка всех символов тире. Например, в плоскости кода U2500 есть 4 кодовых точки «горизонтальной черты» ... вместе с «вертикальными чертами» и «двойными чертами» .)

Будет ли размер дефиса изменяться в зависимости от кодировки.

Это вопрос без ответа. Фактический размер дефиса зависит от того, как он отображается на экране или странице программой рендеринга. Однако факт остается фактом: в некоторых наборах символов существуют разные кодовые точки, которые концептуально представляют разные размеры дефиса или тире. Строго говоря, это не имеет ничего общего с кодировками как таковыми .

Вероятно, здесь происходит то, что символы отображаются из одного набора символов в другой набор символов в различных точках. В некоторых точках целевой набор символов не поддерживает несколько символов дефиса / тире, и сопоставление тихо преобразует «фанки» дефисы в «обычные» дефисы.

Вырезание и вставка символов не поможет вам. Вам нужен способ увидеть фактические значения кодовой точки в шестнадцатеричном формате.

0 голосов
/ 10 августа 2010

Вы можете обнаружить реальные коды, хранящиеся в вашей БД, с помощью функции ASCII () Oracle. Э.Г.

select ascii(substr(t.strng_field, 5, 1)) from string_table t

Но реальные функции для работы в таких случаях зависят от набора символов базы данных строкового столбца и источников данных для заполнения таблицы.

Вы можете выбрать из функций перевода набора символов строки, таких как convert, decompose или unistr в списке здесь .

0 голосов
/ 10 августа 2010

попробуйте выбрать rawtohex (столбец) из таблицы

  • Я не в своем экземпляре оракула, но думаю, что это работает из памяти, дает вам шестнадцатеричный дамп и затем ищет коды
...