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

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

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

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

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

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

Настоящая проблема французского программиста - это объяснить английскому коллеге, что книгу про d'Artagnan, выпущенную издательством O'Reilly не следует читать at five o'clock :)
...
Рейтинг: 0 / 0
10.01.2022, 20:39
    #40125585
Валерий Юринский
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NLS_INITCAP и апостроф
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
10.01.2022, 22:29
    #40125620
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NLS_INITCAP и апостроф
Běžťě do haje.
...
Рейтинг: 0 / 0
10.01.2022, 22:54
    #40125625
SergiiW
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NLS_INITCAP и апостроф
SQL*Plus
Апостроф - это по определению "небуквенный орфографический знак"

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

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

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

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

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

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

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

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


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

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

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

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

А если использовать "правильный" апостроф, то NLS_INITCAP начнет по другому работать?
Википедия(ʼ) «modifier letter apostrophe» (модификатор буквы апостроф ), код U+02BC; используется в качестве небуквенного орфографического знака, то есть является частью слова и не разделяет его на два слова.
...
Рейтинг: 0 / 0
11.01.2022, 22:31
    #40125911
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NLS_INITCAP и апостроф
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
11.01.2022, 23:28
    #40125920
SQL*Plus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NLS_INITCAP и апостроф
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
12.01.2022, 03:05
    #40125930
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NLS_INITCAP и апостроф
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
Форумы / Oracle [игнор отключен] [закрыт для гостей] / NLS_INITCAP и апостроф / 22 сообщений из 22, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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