sss
Специалист
Offline
|
|
« : 27-11-2008 07:54 » |
|
Привет. Кто знает - чего это не хочет работать MultiByteToWideChar для кодовой страницы CP_UTF8 ? Страница установлена ( в языках и стандартах). wchar_t w[2] = {0}; char c[2] = {0};
c[0] = 0xD0; if ( 0 == ::MultiByteToWideChar( CP_UTF8, 0, c, 1, w, 2)) { SHOWLAST(); // Здесь - GetLastError = 0 }
P.S.Ж: Про то, что можно воспользоваться IMultiLanguage я знаю.
|
|
|
Записан
|
while (8==8)
|
|
|
sss
Специалист
Offline
|
|
« Ответ #1 : 27-11-2008 10:02 » |
|
Черт! Кто знает, сколько байт на символ в UTF-8 ?
|
|
|
Записан
|
while (8==8)
|
|
|
Вад
|
|
« Ответ #2 : 27-11-2008 10:13 » |
|
Байт на символ - переменное число. Текст, состоящий только из символов с номером меньше 128, при записи в UTF-8 превращается в обычный текст ASCII. И наоборот, в тексте UTF-8 любой байт со значением меньше 128 изображает символ ASCII с тем же кодом. Остальные символы Юникода изображаются последовательностями длиной от 2 до 6 байтов (реально только до 4 байт, поскольку использование кодов больше 221 не планируется), в которых первый байт всегда имеет вид 11xxxxxx, а остальные — 10xxxxxx.
|
|
|
Записан
|
|
|
|
Антон (LogRus)
|
|
« Ответ #3 : 27-11-2008 10:49 » |
|
У нас используют IBM ICU для перекодирования UTF8
|
|
|
Записан
|
Странно всё это....
|
|
|
sss
Специалист
Offline
|
|
« Ответ #4 : 28-11-2008 02:13 » |
|
Спасибо ребята... Выходит мой код в корне не правилен.
|
|
|
Записан
|
while (8==8)
|
|
|
Антон (LogRus)
|
|
« Ответ #5 : 28-11-2008 07:21 » |
|
нормальный код и кстати должен работать разве, что у тебя UTF-8 строка корявая я бы тебе для начала разжиться нормальной строкой
|
|
|
Записан
|
Странно всё это....
|
|
|
sss
Специалист
Offline
|
|
« Ответ #6 : 28-11-2008 07:54 » |
|
LogRus, в том то и дело. Выходит, в зависимости от значения символа c[0], нужно формировать разную длину массива. Когда имеешь на входе смапленный файл размером 100 МБ, надо править также и указатель курсора на следующий символ, в зависимости от этого c[0].
|
|
|
Записан
|
while (8==8)
|
|
|
Антон (LogRus)
|
|
« Ответ #7 : 28-11-2008 11:11 » |
|
ничего не понял. Может у тебя не верные предпосылки. Расскажи, что ты делаешь.
|
|
|
Записан
|
Странно всё это....
|
|
|
RXL
|
|
« Ответ #8 : 28-11-2008 13:45 » |
|
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
sss
Специалист
Offline
|
|
« Ответ #9 : 01-12-2008 01:58 » |
|
LogRus, допустим есть исходный файл, размером в 100 МБ в кодировке UTF-8. Задача - простой просмотр в кодировке 1251 (FAR F3).
Создаем объект раздел для этого файла - имеем указатель (курсор). Если файл в кодировке CP866, то побайтно преобразуем CP866->UNICODE->CP1251 и просто выводим на экран. Если файл в кодировке UTF-8, простой код превращается в сложный... Необходимо анализировать, сколько байт на символ, и сдвигать курсор соответственно.
|
|
|
Записан
|
while (8==8)
|
|
|
alexplev
Гость
|
|
« Ответ #10 : 01-12-2008 08:55 » |
|
Я часто использую макросы ATL для преобразования строк и забыл о проблемах. Преобразовывают все, даже думать не надо. Пример: CString str; str= CW2A(wstr); Получаем из широкой строки строку класса CString. Найдите в MSDN поиском CW2A, там все просто.
|
|
|
Записан
|
|
|
|
sss
Специалист
Offline
|
|
« Ответ #11 : 01-12-2008 10:04 » |
|
alexplev - буфер str будет 100 МБ и Вы получите зависшее приложение... А кстати, есть предел на длину строки CString ? А если файл будет 3 ГБ ?
|
|
|
Записан
|
while (8==8)
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #12 : 01-12-2008 10:07 » |
|
предела CString нету , вернее - озу+файл подкачки
|
|
|
Записан
|
|
|
|
Антон (LogRus)
|
|
« Ответ #13 : 02-12-2008 07:07 » |
|
sss, читай файл построчно
|
|
|
Записан
|
Странно всё это....
|
|
|
sss
Специалист
Offline
|
|
« Ответ #14 : 02-12-2008 08:26 » |
|
LogRus, примерно так и буду... А если нет CRLF? Ну это так, гипотетически ... Я тут подумываю над примерно таким алгоритмом: 1) Читаем "порцию" (80 - 128 байт). 2) Идем дальше, пока не обнаруживаем символ < 127... предела CString нету , вернее - озу+файл подкачки Алексей1153++, все далеко не так... Чем ограничивается виртуальное адресное пространство процесса ? Неужели можно выделить 2 ГБ + 1 байт в 32 битной системе без AWE? А непрерывность строки?
|
|
|
Записан
|
while (8==8)
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #15 : 02-12-2008 08:33 » |
|
sss, ну я же образно Конечно, всё в разумных пределах должно оставаться, иначе за что нам с тобой з/п платят ? )
|
|
|
Записан
|
|
|
|
Артем
Опытный
Offline
Пол:
Beware the wolf in sheep's clothing.
|
|
« Ответ #16 : 02-12-2008 09:14 » |
|
LogRus, допустим есть исходный файл, размером в 100 МБ в кодировке UTF-8. Задача - простой просмотр в кодировке 1251 (FAR F3).
Насколько я помню, 1251 -- это кириллическая кодировка. Следовательно, чтобы корректно вывести юникод символ в 1251, надо чтобы этот самый символ был тоже "кириллический". Далее, смотрим http://ru.wikipedia.org/wiki/%D0%9A%D0%B8%D1%80%D0%B8%D0%BB%D0%BB%D0%B8%D1%86%D0%B0_%D0%B2_%D0%AE%D0%BD%D0%B8%D0%BA%D0%BE%D0%B4%D0%B5 , и видим, что для кириллицы используется диапазон 0400-04FF (ВАЖНО: это в Unicode!). Теперь смотрим, что такое UTF-8: http://ru.wikipedia.org/wiki/UTF-8 , там есть табличка "Символы UTF-8 получаются из Unicode следующим образом:" из нее мы узнаем, что кириллица (0400-04FF) в UTF-8 (ВСЕГДА!!!) представляется ДВУМЯ байтами!!! В виде 110xxxxx 10xxxxxx. Прочитав пару байт ты сможешь узнать являются ли они кириллическим символом или нет, и, соответственно обрабатывать Но и в общем-то все
|
|
« Последнее редактирование: 02-12-2008 09:21 от Артем »
|
Записан
|
|
|
|
RXL
|
|
« Ответ #17 : 02-12-2008 09:54 » |
|
Надо еще помнить, что в cp1251 входят unicode-символы не только 0x04XX, а также то, что будут символы, которые не входят в cp1251 (их придется либо отбрасывать, либо перекодировать во что-то близкое по смыслу).
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
sss
Специалист
Offline
|
|
« Ответ #18 : 02-12-2008 10:13 » |
|
Артем, я и не сомневаюсь.. Спасибо. Только, почему одни русские? как-то не универсально... Хотя я это просто из вредности....
RXL, напутал? Не "в cp1251 входят unicode-символы не только 0x04XX", а в UTF-8 ?
|
|
« Последнее редактирование: 02-12-2008 10:15 от sss »
|
Записан
|
while (8==8)
|
|
|
Артем
Опытный
Offline
Пол:
Beware the wolf in sheep's clothing.
|
|
« Ответ #19 : 02-12-2008 13:32 » |
|
Артем, я и не сомневаюсь.. Спасибо. Только, почему одни русские? как-то не универсально...
Ты имеешь ввиду, "почему одни русские обрабатывать в 1251 ?" ? Потому что, очень трудно отобразить, например, китайские иероглифы в ср1251 А насчет точного диапазона, конечно же лучше посмотреть http://ru.wikipedia.org/wiki/CP1251
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #20 : 02-12-2008 14:13 » |
|
sss, нет, не напутал. Символы Unicode <--maping--> Символы 8-битных кодировок UTF-8 - форма представления Unicode. 1. Конвертируешь UTF-8 (multi byte) в Unicode (wide char). 2. Нужна таблица мепинга: cp1251 -> Unicode. Выполняешь обратный поиск. 3. Все, что не вошло в cp1251 - откидывать. Таблица соответсвия. Unicode cp1251 Название символа CHARMAP <U0000> /x00 NULL (NUL) <U0001> /x01 START OF HEADING (SOH) <U0002> /x02 START OF TEXT (STX) <U0003> /x03 END OF TEXT (ETX) <U0004> /x04 END OF TRANSMISSION (EOT) <U0005> /x05 ENQUIRY (ENQ) <U0006> /x06 ACKNOWLEDGE (ACK) <U0007> /x07 BELL (BEL) <U0008> /x08 BACKSPACE (BS) <U0009> /x09 CHARACTER TABULATION (HT) <U000A> /x0a LINE FEED (LF) <U000B> /x0b LINE TABULATION (VT) <U000C> /x0c FORM FEED (FF) <U000D> /x0d CARRIAGE RETURN (CR) <U000E> /x0e SHIFT OUT (SO) <U000F> /x0f SHIFT IN (SI) <U0010> /x10 DATALINK ESCAPE (DLE) <U0011> /x11 DEVICE CONTROL ONE (DC1) <U0012> /x12 DEVICE CONTROL TWO (DC2) <U0013> /x13 DEVICE CONTROL THREE (DC3) <U0014> /x14 DEVICE CONTROL FOUR (DC4) <U0015> /x15 NEGATIVE ACKNOWLEDGE (NAK) <U0016> /x16 SYNCHRONOUS IDLE (SYN) <U0017> /x17 END OF TRANSMISSION BLOCK (ETB) <U0018> /x18 CANCEL (CAN) <U0019> /x19 END OF MEDIUM (EM) <U001A> /x1a SUBSTITUTE (SUB) <U001B> /x1b ESCAPE (ESC) <U001C> /x1c FILE SEPARATOR (IS4) <U001D> /x1d GROUP SEPARATOR (IS3) <U001E> /x1e RECORD SEPARATOR (IS2) <U001F> /x1f UNIT SEPARATOR (IS1) <U0020> /x20 SPACE <U0021> /x21 EXCLAMATION MARK <U0022> /x22 QUOTATION MARK <U0023> /x23 NUMBER SIGN <U0024> /x24 DOLLAR SIGN <U0025> /x25 PERCENT SIGN <U0026> /x26 AMPERSAND <U0027> /x27 APOSTROPHE <U0028> /x28 LEFT PARENTHESIS <U0029> /x29 RIGHT PARENTHESIS <U002A> /x2a ASTERISK <U002B> /x2b PLUS SIGN <U002C> /x2c COMMA <U002D> /x2d HYPHEN-MINUS <U002E> /x2e FULL STOP <U002F> /x2f SOLIDUS <U0030> /x30 DIGIT ZERO <U0031> /x31 DIGIT ONE <U0032> /x32 DIGIT TWO <U0033> /x33 DIGIT THREE <U0034> /x34 DIGIT FOUR <U0035> /x35 DIGIT FIVE <U0036> /x36 DIGIT SIX <U0037> /x37 DIGIT SEVEN <U0038> /x38 DIGIT EIGHT <U0039> /x39 DIGIT NINE <U003A> /x3a COLON <U003B> /x3b SEMICOLON <U003C> /x3c LESS-THAN SIGN <U003D> /x3d EQUALS SIGN <U003E> /x3e GREATER-THAN SIGN <U003F> /x3f QUESTION MARK <U0040> /x40 COMMERCIAL AT <U0041> /x41 LATIN CAPITAL LETTER A <U0042> /x42 LATIN CAPITAL LETTER B <U0043> /x43 LATIN CAPITAL LETTER C <U0044> /x44 LATIN CAPITAL LETTER D <U0045> /x45 LATIN CAPITAL LETTER E <U0046> /x46 LATIN CAPITAL LETTER F <U0047> /x47 LATIN CAPITAL LETTER G <U0048> /x48 LATIN CAPITAL LETTER H <U0049> /x49 LATIN CAPITAL LETTER I <U004A> /x4a LATIN CAPITAL LETTER J <U004B> /x4b LATIN CAPITAL LETTER K <U004C> /x4c LATIN CAPITAL LETTER L <U004D> /x4d LATIN CAPITAL LETTER M <U004E> /x4e LATIN CAPITAL LETTER N <U004F> /x4f LATIN CAPITAL LETTER O <U0050> /x50 LATIN CAPITAL LETTER P <U0051> /x51 LATIN CAPITAL LETTER Q <U0052> /x52 LATIN CAPITAL LETTER R <U0053> /x53 LATIN CAPITAL LETTER S <U0054> /x54 LATIN CAPITAL LETTER T <U0055> /x55 LATIN CAPITAL LETTER U <U0056> /x56 LATIN CAPITAL LETTER V <U0057> /x57 LATIN CAPITAL LETTER W <U0058> /x58 LATIN CAPITAL LETTER X <U0059> /x59 LATIN CAPITAL LETTER Y <U005A> /x5a LATIN CAPITAL LETTER Z <U005B> /x5b LEFT SQUARE BRACKET <U005C> /x5c REVERSE SOLIDUS <U005D> /x5d RIGHT SQUARE BRACKET <U005E> /x5e CIRCUMFLEX ACCENT <U005F> /x5f LOW LINE <U0060> /x60 GRAVE ACCENT <U0061> /x61 LATIN SMALL LETTER A <U0062> /x62 LATIN SMALL LETTER B <U0063> /x63 LATIN SMALL LETTER C <U0064> /x64 LATIN SMALL LETTER D <U0065> /x65 LATIN SMALL LETTER E <U0066> /x66 LATIN SMALL LETTER F <U0067> /x67 LATIN SMALL LETTER G <U0068> /x68 LATIN SMALL LETTER H <U0069> /x69 LATIN SMALL LETTER I <U006A> /x6a LATIN SMALL LETTER J <U006B> /x6b LATIN SMALL LETTER K <U006C> /x6c LATIN SMALL LETTER L <U006D> /x6d LATIN SMALL LETTER M <U006E> /x6e LATIN SMALL LETTER N <U006F> /x6f LATIN SMALL LETTER O <U0070> /x70 LATIN SMALL LETTER P <U0071> /x71 LATIN SMALL LETTER Q <U0072> /x72 LATIN SMALL LETTER R <U0073> /x73 LATIN SMALL LETTER S <U0074> /x74 LATIN SMALL LETTER T <U0075> /x75 LATIN SMALL LETTER U <U0076> /x76 LATIN SMALL LETTER V <U0077> /x77 LATIN SMALL LETTER W <U0078> /x78 LATIN SMALL LETTER X <U0079> /x79 LATIN SMALL LETTER Y <U007A> /x7a LATIN SMALL LETTER Z <U007B> /x7b LEFT CURLY BRACKET <U007C> /x7c VERTICAL LINE <U007D> /x7d RIGHT CURLY BRACKET <U007E> /x7e TILDE <U007F> /x7f DELETE (DEL) <U0402> /x80 CYRILLIC CAPITAL LETTER DJE (Serbocroatian) <U0403> /x81 CYRILLIC CAPITAL LETTER GJE <U201A> /x82 SINGLE LOW-9 QUOTATION MARK <U0453> /x83 CYRILLIC SMALL LETTER GJE <U201E> /x84 DOUBLE LOW-9 QUOTATION MARK <U2026> /x85 HORIZONTAL ELLIPSIS <U2020> /x86 DAGGER <U2021> /x87 DOUBLE DAGGER <U20AC> /x88 EURO SIGN <U2030> /x89 PER MILLE SIGN <U0409> /x8a CYRILLIC CAPITAL LETTER LJE <U2039> /x8b SINGLE LEFT-POINTING ANGLE QUOTATION MARK <U040A> /x8c CYRILLIC CAPITAL LETTER NJE <U040C> /x8d CYRILLIC CAPITAL LETTER KJE <U040B> /x8e CYRILLIC CAPITAL LETTER TSHE (Serbocroatian) <U040F> /x8f CYRILLIC CAPITAL LETTER DZHE <U0452> /x90 CYRILLIC SMALL LETTER DJE (Serbocroatian) <U2018> /x91 LEFT SINGLE QUOTATION MARK <U2019> /x92 RIGHT SINGLE QUOTATION MARK <U201C> /x93 LEFT DOUBLE QUOTATION MARK <U201D> /x94 RIGHT DOUBLE QUOTATION MARK <U2022> /x95 BULLET <U2013> /x96 EN DASH <U2014> /x97 EM DASH <U2122> /x99 TRADE MARK SIGN <U0459> /x9a CYRILLIC SMALL LETTER LJE <U203A> /x9b SINGLE RIGHT-POINTING ANGLE QUOTATION MARK <U045A> /x9c CYRILLIC SMALL LETTER NJE <U045C> /x9d CYRILLIC SMALL LETTER KJE <U045B> /x9e CYRILLIC SMALL LETTER TSHE (Serbocroatian) <U045F> /x9f CYRILLIC SMALL LETTER DZHE <U00A0> /xa0 NO-BREAK SPACE <U040E> /xa1 CYRILLIC CAPITAL LETTER SHORT U (Byelorussian) <U045E> /xa2 CYRILLIC SMALL LETTER SHORT U (Byelorussian) <U0408> /xa3 CYRILLIC CAPITAL LETTER JE <U00A4> /xa4 CURRENCY SIGN <U0490> /xa5 CYRILLIC CAPITAL LETTER GHE WITH UPTURN <U00A6> /xa6 BROKEN BAR <U00A7> /xa7 SECTION SIGN <U0401> /xa8 CYRILLIC CAPITAL LETTER IO <U00A9> /xa9 COPYRIGHT SIGN <U0404> /xaa CYRILLIC CAPITAL LETTER UKRAINIAN IE <U00AB> /xab LEFT-POINTING DOUBLE ANGLE QUOTATION MARK <U00AC> /xac NOT SIGN <U00AD> /xad SOFT HYPHEN <U00AE> /xae REGISTERED SIGN <U0407> /xaf CYRILLIC CAPITAL LETTER YI (Ukrainian) <U00B0> /xb0 DEGREE SIGN <U00B1> /xb1 PLUS-MINUS SIGN <U0406> /xb2 CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I <U0456> /xb3 CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I <U0491> /xb4 CYRILLIC SMALL LETTER GHE WITH UPTURN <U00B5> /xb5 MICRO SIGN <U00B6> /xb6 PILCROW SIGN <U00B7> /xb7 MIDDLE DOT <U0451> /xb8 CYRILLIC SMALL LETTER IO <U2116> /xb9 NUMERO SIGN <U0454> /xba CYRILLIC SMALL LETTER UKRAINIAN IE <U00BB> /xbb RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK <U0458> /xbc CYRILLIC SMALL LETTER JE <U0405> /xbd CYRILLIC CAPITAL LETTER DZE <U0455> /xbe CYRILLIC SMALL LETTER DZE <U0457> /xbf CYRILLIC SMALL LETTER YI (Ukrainian) <U0410> /xc0 CYRILLIC CAPITAL LETTER A <U0411> /xc1 CYRILLIC CAPITAL LETTER BE <U0412> /xc2 CYRILLIC CAPITAL LETTER VE <U0413> /xc3 CYRILLIC CAPITAL LETTER GHE <U0414> /xc4 CYRILLIC CAPITAL LETTER DE <U0415> /xc5 CYRILLIC CAPITAL LETTER IE <U0416> /xc6 CYRILLIC CAPITAL LETTER ZHE <U0417> /xc7 CYRILLIC CAPITAL LETTER ZE <U0418> /xc8 CYRILLIC CAPITAL LETTER I <U0419> /xc9 CYRILLIC CAPITAL LETTER SHORT I <U041A> /xca CYRILLIC CAPITAL LETTER KA <U041B> /xcb CYRILLIC CAPITAL LETTER EL <U041C> /xcc CYRILLIC CAPITAL LETTER EM <U041D> /xcd CYRILLIC CAPITAL LETTER EN <U041E> /xce CYRILLIC CAPITAL LETTER O <U041F> /xcf CYRILLIC CAPITAL LETTER PE <U0420> /xd0 CYRILLIC CAPITAL LETTER ER <U0421> /xd1 CYRILLIC CAPITAL LETTER ES <U0422> /xd2 CYRILLIC CAPITAL LETTER TE <U0423> /xd3 CYRILLIC CAPITAL LETTER U <U0424> /xd4 CYRILLIC CAPITAL LETTER EF <U0425> /xd5 CYRILLIC CAPITAL LETTER HA <U0426> /xd6 CYRILLIC CAPITAL LETTER TSE <U0427> /xd7 CYRILLIC CAPITAL LETTER CHE <U0428> /xd8 CYRILLIC CAPITAL LETTER SHA <U0429> /xd9 CYRILLIC CAPITAL LETTER SHCHA <U042A> /xda CYRILLIC CAPITAL LETTER HARD SIGN <U042B> /xdb CYRILLIC CAPITAL LETTER YERU <U042C> /xdc CYRILLIC CAPITAL LETTER SOFT SIGN <U042D> /xdd CYRILLIC CAPITAL LETTER E <U042E> /xde CYRILLIC CAPITAL LETTER YU <U042F> /xdf CYRILLIC CAPITAL LETTER YA <U0430> /xe0 CYRILLIC SMALL LETTER A <U0431> /xe1 CYRILLIC SMALL LETTER BE <U0432> /xe2 CYRILLIC SMALL LETTER VE <U0433> /xe3 CYRILLIC SMALL LETTER GHE <U0434> /xe4 CYRILLIC SMALL LETTER DE <U0435> /xe5 CYRILLIC SMALL LETTER IE <U0436> /xe6 CYRILLIC SMALL LETTER ZHE <U0437> /xe7 CYRILLIC SMALL LETTER ZE <U0438> /xe8 CYRILLIC SMALL LETTER I <U0439> /xe9 CYRILLIC SMALL LETTER SHORT I <U043A> /xea CYRILLIC SMALL LETTER KA <U043B> /xeb CYRILLIC SMALL LETTER EL <U043C> /xec CYRILLIC SMALL LETTER EM <U043D> /xed CYRILLIC SMALL LETTER EN <U043E> /xee CYRILLIC SMALL LETTER O <U043F> /xef CYRILLIC SMALL LETTER PE <U0440> /xf0 CYRILLIC SMALL LETTER ER <U0441> /xf1 CYRILLIC SMALL LETTER ES <U0442> /xf2 CYRILLIC SMALL LETTER TE <U0443> /xf3 CYRILLIC SMALL LETTER U <U0444> /xf4 CYRILLIC SMALL LETTER EF <U0445> /xf5 CYRILLIC SMALL LETTER HA <U0446> /xf6 CYRILLIC SMALL LETTER TSE <U0447> /xf7 CYRILLIC SMALL LETTER CHE <U0448> /xf8 CYRILLIC SMALL LETTER SHA <U0449> /xf9 CYRILLIC SMALL LETTER SHCHA <U044A> /xfa CYRILLIC SMALL LETTER HARD SIGN <U044B> /xfb CYRILLIC SMALL LETTER YERU <U044C> /xfc CYRILLIC SMALL LETTER SOFT SIGN <U044D> /xfd CYRILLIC SMALL LETTER E <U044E> /xfe CYRILLIC SMALL LETTER YU <U044F> /xff CYRILLIC SMALL LETTER YA
|
|
« Последнее редактирование: 02-12-2008 14:15 от RXL »
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
|