powered by simpleCommunicator - 2.0.30     © 2024 Programmizd 02
Map
Форумы / Oracle [игнор отключен] [закрыт для гостей] / NLS_INITCAP и апостроф
22 сообщений из 22, страница 1 из 1
NLS_INITCAP и апостроф
    #40125385
SergiiW
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Может кто знает.
Можно исправить поведение NLS_INITCAP
Код: plsql
1.
select NLS_INITCAP('мар’іна горка', 'NLS_SORT = RUSSIAN') apostrof from dual

чтобы он выдавал правильно "Мар’ і на Горка", редактированием кодировки RUSSIAN? Сейчас он выдает "Мар’ І на Горка".
...
Рейтинг: 0 / 0
NLS_INITCAP и апостроф
    #40125536
SQL*Plus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SergiiW,

АпострóфАпострóф (фр. apostrophe от др.-греч. ἀπόστροφος — «обращённый назад»)
— небуквенный орфографический знак в виде надстрочной запятой (’),
штриха или любого другого похожего начертания, который употребляется
в буквенном письме разных языков в различном назначении.
NLS_INITCAPNLS_INITCAP returns char, with the first letter of each word in uppercase, all other letters in
lowercase. Words are delimited by white space or characters that are not alphanumeric.
То есть всё работает в соответствии с документацией, поскольку апостроф не является ни буквой, ни цифрой (not alphanumeric).
Таким образом, в строке 'мар’іна горка' имеем три слова 'мар', 'іна' и 'горка'.

Попробуйте действовать, например, так:
Код: plsql
1.
2.
3.
4.
5.
SQL> SELECT REPLACE( NLS_INITCAP( REPLACE('мар`іна горка', '`', 'ъьъ')), 'ъьъ', '`') AS apostrophe FROM dual;

APOSTROPHE   
-------------
Мар`іна Горка
...
Рейтинг: 0 / 0
NLS_INITCAP и апостроф
    #40125561
SergiiW
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SQL*Plus,

Спасибо! Интересует только исправление NLS_INITCAP.
...
Рейтинг: 0 / 0
NLS_INITCAP и апостроф
    #40125562
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для этого нужно использовать коллейт, который считает апостроф буквой. То есть
явно не русский. Например, чешский.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
NLS_INITCAP и апостроф
    #40125566
SQL*Plus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SergiiW
SQL*Plus,

Спасибо! Интересует только исправление NLS_INITCAP.

Функцию NLS_INITCAP исправлять не нужно.
Она работает именно так, как написано в документации.

У французского программиста другая проблема: нет такой функции NLS_D_ARTAGNAN :-)
Код: plsql
1.
2.
3.
SRC_STR               NLS_D_ARTAGNAN(SRC_STR)                                                                                                              
--------------------- --------------------------------
D`Artagnan д’артаньян d`Artagnan д’Артаньян



Вариант решения возникшей у вас проблемы я привел выше.
"Вам нужно ехать или нужны щашечки?" :-)
...
Рейтинг: 0 / 0
NLS_INITCAP и апостроф
    #40125567
SQL*Plus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

Для этого нужно использовать коллейт, который считает апостроф буквой.
То есть явно не русский. Например, чешский.
Апостроф - это по определению "небуквенный орфографический знак"
...
Рейтинг: 0 / 0
NLS_INITCAP и апостроф
    #40125575
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL*Plus
Dimitry Sibiryakov

Для этого нужно использовать коллейт
Апостроф - это по определению "небуквенный орфографический знак"

Правила nls_comp = Linguistic сложнее.
Там выделяют Contracting Characters, Expanding Characters, Context-Sensitive Characters
вводят понятие Canonical Equivalence
...
Рейтинг: 0 / 0
NLS_INITCAP и апостроф
    #40125579
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL*Plus
У французского программиста другая проблема d`Artagnan

Настоящая проблема французского программиста - это объяснить английскому коллеге, что книгу про d'Artagnan, выпущенную издательством O'Reilly не следует читать at five o'clock :)
...
Рейтинг: 0 / 0
NLS_INITCAP и апостроф
    #40125585
Фотография Валерий Юринский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous
SQL*Plus
пропущено...
Апостроф - это по определению "небуквенный орфографический знак"

Правила nls_comp = Linguistic сложнее.
Там выделяют Contracting Characters, Expanding Characters, Context-Sensitive Characters
вводят понятие Canonical Equivalence

А функция NLS_INITCAP смотрит на все эти вещи проще.
О чем и написано в документации.

Буквы + цифры = "букво-цифры" (alphanumeric)
Вся остальная хрень - это "не букво-цифры" (not alphanumeric), которые разделяют слова. :-)

Все буквы перечислены в алфавите.
Цифры в 10-тиричной системе мы используем: 0 1 2 3 4 5 6 7 8 9.

Примеры из других языков с другими буквами и цифрами приветствуются. :-)
...
Рейтинг: 0 / 0
NLS_INITCAP и апостроф
    #40125620
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Běžťě do haje.
...
Рейтинг: 0 / 0
NLS_INITCAP и апостроф
    #40125625
SergiiW
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SQL*Plus
Апостроф - это по определению "небуквенный орфографический знак"

Почему так решили? Что относится к буквенным символам? Есть определение? Я думал, что это определяется используемой кодировкой.
Насколько мне известно, в некоторых странах, не только апостроф относиться к буквенным символам.
Например, но "Мар’іна" это не два слова, а одно, даже если используется апостроф.
...
Рейтинг: 0 / 0
NLS_INITCAP и апостроф
    #40125669
SQL*Plus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL*Plus
АпострóфАпострóф (фр. apostrophe от др.-греч. ἀπόστροφος — «обращённый назад»)
небуквенный орфографический знак в виде надстрочной запятой (’),
штриха или любого другого похожего начертания, который употребляется
в буквенном письме разных языков в различном назначении.
...
Рейтинг: 0 / 0
NLS_INITCAP и апостроф
    #40125878
SergiiW
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SQL*Plus,

Не думаю, что для Oracle Википедия (русская) является законом.
Может есть ссылка на документы Oracle, что является буквенными знаками? К сожалению, я не нашел.
...
Рейтинг: 0 / 0
NLS_INITCAP и апостроф
    #40125880
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В Globalization Support Guide утверждают, что oracle rdbms поддерживает UCA.
А NLS_INITCAP отличается от INITCAP тем, что дружит с Globalization Support, учитывая назначенный Collation в своей работе.
Среди предустановленных Collation особенностей обработки апострофа я пока не увидел (даже в collations из группы Punctuation), но Locale Builder тоже никто не отменял, желающие могут проверить возможности NLS_% функций с его помощью.
...
Рейтинг: 0 / 0
NLS_INITCAP и апостроф
    #40125882
SergiiW
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andrey_anonymous,

Спасибо!
Нужно разбираться с Locale Builder.
...
Рейтинг: 0 / 0
NLS_INITCAP и апостроф
    #40125899
SQL*Plus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SergiiW
SQL*Plus,

Не думаю, что для Oracle Википедия (русская) является законом.
Может есть ссылка на документы Oracle, что является буквенными знаками? К сожалению, я не нашел.

Почитайте по теме википедию и источники, на которые она ссылается на любом другом языке.

Буквы - это то, что составляет алфавит языка.
В белорусском алфавите разве есть буква "апостроф"?

Нету в нём такой буквы.
https://ru.wikipedia.org/wiki/Белорусский_алфавит
(Странно, но в википедии нет статьи про белорусские алфавиты на белорусском языке. :-(

Вы уж изучите первый официальный язык страны, где имеется Мар’іна Горка. :-)


Тут название написано на втором официальном языке.
...
Рейтинг: 0 / 0
NLS_INITCAP и апостроф
    #40125900
SQL*Plus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SergiiW
andrey_anonymous,

Спасибо!
Нужно разбираться с Locale Builder.

Сначала поговорите с вашим руководителем и расскажите ему,
как в будущем придется сопровождать эту "набилденную локаль" :-)
...
Рейтинг: 0 / 0
NLS_INITCAP и апостроф
    #40125904
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SergiiWНужно разбираться с Locale Builder.

Или просто использовать правильный апостроф:
https://ru.wikipedia.org/wiki/Апостроф#Типографский_апостроф
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
NLS_INITCAP и апостроф
    #40125908
SergiiW
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov
Или просто использовать правильный апостроф:

А если использовать "правильный" апостроф, то NLS_INITCAP начнет по другому работать?
Википедия(ʼ) «modifier letter apostrophe» (модификатор буквы апостроф ), код U+02BC; используется в качестве небуквенного орфографического знака, то есть является частью слова и не разделяет его на два слова.
...
Рейтинг: 0 / 0
NLS_INITCAP и апостроф
    #40125911
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SergiiW

А если использовать "правильный" апостроф, то NLS_INITCAP начнет по другому работать?


Нет. Валерий Юринский все объяснил. INITCAP древняя функция. Вот REGEXP разницу понимает:

INTCAP:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
with data as (
              select  q'[Hell's kitchen]'         apostrophe,
                      unistr('Hell\02BCs kitchen') apostrophe_modifier
                from  dual
             )
select  initcap(apostrophe)          initcap_apostrophe,
        initcap(apostrophe_modifier) initcap_apostrophe_modifier
  from  data
/

INITCAP_APOSTROPHE INITCAP_APOSTROPHE_MODIFIER
------------------ ---------------------------
Hell'S Kitchen     Hell'S Kitchen

SQL>



REGEXP:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
with data as (
              select  q'[Hell's kitchen]'         apostrophe,
                      unistr('Hell\02BCs kitchen') apostrophe_modifier
                from  dual
             )
select  regexp_replace(apostrophe,'(\w+)','[\1]')          regexp_apostrophe,
        regexp_replace(apostrophe_modifier,'(\w+)','[\1]') regexp_apostrophe_modifier
  from  data
/

REGEXP_APOSTROPHE    REGEXP_APOSTROPHE_MODIFIER
-------------------- ---------------------------
[Hell]'[s] [kitchen] [Hell's] [kitchen]

SQL>



SY.
...
Рейтинг: 0 / 0
NLS_INITCAP и апостроф
    #40125920
SQL*Plus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

SergiiWНужно разбираться с Locale Builder.

Или просто использовать правильный апостроф:
https://ru.wikipedia.org/wiki/Апостроф#Типографский_апостроф


Эксперименты с разными "неправильными" и "правильными" апострофами.
Для изучения и размышления.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
SET ECHO ON;
COLUMN w FORMAT A16;
COLUMN n_initcap FORMAT A15;

WITH aps AS (
-- U+0027 = «машинописный апостроф» — под названием «apostrophe» (апостроф) 
-- или «apostrophe-quote» (кавычка-апостроф) с кодом ' 
-- (шестнадцатеричный U+0027), совпадающий с кодировкой ASCII;
SELECT '0027' AS U_Code, CHR(TO_NUMBER('0027', 'XXXX')) AS apostr FROM dual UNION ALL
-- U+0060 = «машинописный обратный апостроф», код ` (шестнадцатеричный U+0060), 
-- также совпадающий с ASCII.
SELECT '0060', CHR(TO_NUMBER('0060', 'XXXX')) AS apostr FROM dual UNION ALL
-- U+2019 = собственно апостроф (как знак препинания), 
-- английская одиночная правая кавычка, кавычка-запятая 
-- («right single quotation mark», «single comma quotation mark»), 
-- имеет код U+2019 (’ или ’); как знак препинания, 
-- разделяет стоящие по разные от него стороны части на два слова.
SELECT '2019', CHR(TO_NUMBER('2019', 'XXXX')) FROM dual UNION ALL
-- U+055A = armenian apostrophe — апостроф в армянском письме
SELECT '055A', CHR(TO_NUMBER('055A', 'XXXX')) FROM dual UNION ALL
-- U+02BC = modifier letter apostrophe» (модификатор буквы апостроф), ; 
SELECT '02BC', CHR(TO_NUMBER('02BC', 'XXXX'))  FROM dual UNION ALL
-- U+055A = armenian apostrophe — апостроф в армянском письме
SELECT '055A', CHR(TO_NUMBER('055A', 'XXXX'))  FROM dual UNION ALL
-- U+FF07 = fullwidth apostrophe — полноширинный апостроф;
SELECT 'FF07', CHR(TO_NUMBER('FF07', 'XXXX'))  FROM dual UNION ALL
-- U+2032 = штрих, используемый в научно-технических обозначениях 
-- (производные, угловые секунды, футы и др.), код U+2032  
-- prime (′ или ′) и U+02B9 ʹ modifier letter prime;
SELECT '2032', CHR(TO_NUMBER('2032', 'XXXX'))  FROM dual UNION ALL
-- U+2018 = одиночная английская левая кавычка, код U+2018 (‘ или ‘);
SELECT '2018', CHR(TO_NUMBER('2018', 'XXXX'))  FROM dual UNION ALL
-- U+0374 = greek numeral sign — знак в греческой системе счисления;
SELECT '0374', CHR(TO_NUMBER('0374', 'XXXX'))  FROM dual)
--
, wrd AS (
SELECT 'мар' || APS.apostr || 'іна горка' AS w, u_code FROM aps, dual)
--
SELECT w, NLS_INITCAP(w) AS n_initcap, u_code
FROM wrd
;

                N_INITCAP       U_CO
---------------- --------------- ----
мар'іна горка    Мар'Іна Горка   0027
мар`іна горка    Мар`Іна Горка   0060
мар іна горка   Мар Іна Горка  2019
марZіна горка   МарZіна Горка  055A
мар?іна горка   Мар?Іна Горка  02BC
марZіна горка   МарZіна Горка  055A
мар?іна горка   Мар?Іна Горка  FF07
мар 2іна горка   Мар 2іна Горка  2032
мар іна горка   Мар Іна Горка  2018
марtіна горка   МарTіна Горка  0374

10 rows selected. 
...
Рейтинг: 0 / 0
NLS_INITCAP и апостроф
    #40125930
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
SQL*Plus
Код: plsql
1.
SELECT '2019', CHR(TO_NUMBER('2019', 'XXXX')) FROM dual

на nCHR хоть поменяйте:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SQL> SELECT '2019' x, CHR(TO_NUMBER('2019', 'XXXX')) c FROM dual;

X    C
---- ----
2019  

SQL> SELECT '2019' x, nCHR(TO_NUMBER('2019', 'XXXX')) c FROM dual;

X    C
---- ----
2019 ’
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / NLS_INITCAP и апостроф
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]