На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Обратите внимание:
1. Прежде чем начать новую тему или отправить сообщение, убедитесь, что вы не нарушаете правил форума!
2. Обязательно воспользуйтесь поиском. Возможно, Ваш вопрос уже обсуждали. Полезные ссылки приведены ниже.
3. Темы с просьбой выполнить какую-либо работу за автора в этом разделе не обсуждаются.
4. Используйте теги [ code=cpp ] ...текст программы... [ /code ] для выделения текста программы подсветкой.
5. Помните, здесь телепатов нет. Старайтесь формулировать свой вопрос максимально грамотно и чётко: Как правильно задавать вопросы
6. Запрещено отвечать в темы месячной и более давности без веских на то причин.

Полезные ссылки:
user posted image FAQ Сайта (C++) user posted image FAQ Форума user posted image Наши Исходники user posted image Поиск по Разделу user posted image MSDN Library Online (Windows Driver Kit) user posted image Google

Ваше мнение о модераторах: user posted image B.V.
Модераторы: B.V.
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
> какие номера у кодировок utf16?
    Здравствуйте!

    Я кажется забыл номера кодировок. Странно. В таблице написано что utf-16 это 1200 и 1201. Но не работает!
    https://msdn.microsoft.com/en-us/library/wi...ror=-2147217396

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

    Делаю маленькую тулзу. Обычный MultiByteToWideChar и всё такое.

    И вдруг, когда стал указывать ей utf-16 le, utf-16 be, она выдала ошибку.

    Я удивился, но в итоге, сделал простенькую проверку.
    ExpandedWrap disabled
      /* это работает. */
      _ASSERTE( ::IsValidCodePage( 65001 ) );
       
      /* это ругается. */
      _ASSERTE( ::IsValidCodePage( 1200 ) );
      _ASSERTE( ::IsValidCodePage( 1201 ) );
      _ASSERTE( ::IsValidCodePage( 12000 ) );
      _ASSERTE( ::IsValidCodePage( 12001 ) );


    Не пойму, в чём я накосячил?
    Раньше нечто подобное писал, но такого не проявлялось.

    Может быть, в самом деле, напутал с кодировками? А есть ли константы аналогичные CP_UTF8 для других юникодовых страниц?
    Сообщение отредактировано: Eric-S -
      Цитата Eric-S @
      И вдруг, когда стал указывать ей utf-16 le, utf-16 be, она выдала ошибку.

      А какую, если не секрет?
        Цитата B.V. @
        А какую, если не секрет?
        GetLastError возвращает 0 - всё хорошо. А те функции просто говорят, что "страницы неверные":
        Цитата справка
        Return Value
        Returns a nonzero value if the code page is valid, or 0 if the code page is invalid.

        Remarks
        A code page is considered valid only if it is installed on the operating system. Unicode is preferred.
        Starting with Windows Vista, all code pages that can be installed are loaded by default.
          Цитата B.V. @
          Цитата Eric-S @
          И вдруг, когда стал указывать ей utf-16 le, utf-16 be, она выдала ошибку.

          А какую, если не секрет?

          Конкретно MultiByteToWideChar... |там у меня ретранслируются в std::system_error), заявила, что неверный параметр.

          А соответственно IsValidCodePage, возвращает FALSE.

          Попробовал вывести все установленные кодировки:
          ExpandedWrap disabled
            ::EnumSystemCodePages( &output_proc, CP_INSTALLED );

          Вывела много, есть 65001, 866, 1251, а вот utf16 и не нашёл.
            Цитата Eric-S @
            Вывела много, есть 65001, 866, 1251, а вот utf16 и не нашёл.

            Открываем редактор Far, создаем "левый" текстовой файл, переключаем кодировку [Shift+F8] и наблюдаем интересующие: UTF-16 (Little endian) 1200, UTF-16 (Big endian) 1201. Бинго. Потом гуглим, и находим подтверждение, вдруг Рошал был не честен. Нет, все ровно 8-)
              Цитата Eric-S @
              Делаю маленькую тулзу. Обычный MultiByteToWideChar и всё такое.
              И вдруг, когда стал указывать ей utf-16 le, utf-16 be, она выдала ошибку.

              Полагаю, что так и должно быть.
              Эта функция преобразует ASCII-строку в UTF-16.
              А WideCharToMultiByte - наоборот.
              Про UTF-16 они уже знают, это указывать не надо.
              ---
              Если EnumSystemCodePages не находит UTF-16, значит так оно и есть.
              Вот Enumerating System Code Pages посмотри пример.
                Цитата JoeUser @
                и наблюдаем интересующие: UTF-16 (Little endian) 1200, UTF-16 (Big endian) 1201

                Дык, всё так. Но почему-то сломалось. Может я винду тавокнул и потерял несколько кодировок.

                Добавлено
                Цитата ЫукпШ @
                Полагаю, что так и должно быть.

                Нет. так не должно быть. Ибо:
                во-первых внутреннее представление, не обязательно utf16le. Оно вобще когда-то было uc-2.
                Во-вторых, конвертировать в utf16le из utf16be тоже надо.
                Ну и в добавок, всё выше написаное касается не только utf-16 но и utf-32. Оно тоже не работает!
                  Цитата Eric-S @
                  Делаю маленькую тулзу. Обычный MultiByteToWideChar и всё такое.

                  Цитата Eric-S @
                  Может я винду тавокнул и потерял несколько кодировок.

                  Eric-S, это конечно оффтопик, тем не менее ... подумай а надо ли оно тебе (привязываться к свойствам/возможностям установленной винды)? Допустим не только у тебя "такая винда" ... Я просто не помню как это в Win 8.1, на которой сейчас сижу, но помню, что в XP - локали типа UTF16* вроде бы не были установлены по умолчанию. Что в итоге имеем? Твоя тулза в некоторых случаях будет "говорить" нечто типа "Эй, товарисч, у тя винда не той системы!". Оно тебе надо? Если не надо - глянь уже готовую либу ICU, там должно все быть. Но народ люто ненавидит, впрочем как и я, эту либу - ибо она компилиться в 25-метровую библиотеку. Но все ж признают, мол для UTF16* лучших альтернатив пока нет.
                    Цитата JoeUser @
                    Твоя тулза в некоторых случаях будет "говорить" нечто типа "Эй, товарисч, у тя винда не той системы!

                    Ну и пусть говорит. Если не той, значит не той.
                    Собственно это так, мелкая примочка для тулзы. Хотелось, чтоб она умела открывать файлы в разных кодировках.
                    Но для работы хватает и utf-8 и даже cp-1251.

                    Я опасался, в первую очередь того, что сам где-то накосячил и затупив, не понял, в чём именно.

                    Хотя, как-то всё странно. Первый раз с такой фигнёй сталкиваюсь. Раньше всё работало. Или я немного иначе делал...

                    Тащить стороннюю либу, тоже можно. Размер не пугает. Там же целая куча charset'ов вбита. Я даже восхищаюсь, как они смогли так много затолкать в столь скромный размер.

                    Возможно, что они там, чего-нибудь тоже почикали, потеряв несколько кодировок. Ну и как говорится "умер Никодим, ну и хрен с ним".

                    Зато моя мелкая тулза, на 500 строк кода, весом в 25 мегабайт будет смотрется солиднее. Гы-гы-гы.

                    Добавлено
                    Цитата JoeUser @
                    глянь уже готовую либу ICU, там должно все быть. Но народ люто ненавидит,

                    На самом деле, давно её знаю. Но как-то привык, встроенными функциями конвертировать. Привычка, вторая натура. Но всё равно спасибо!
                      Цитата Eric-S @
                      Тащить стороннюю либу, тоже можно. Размер не пугает.

                      У меня есть сильные подозрения - что там махровый быдлокод! :) Только подозрения, утверждать ниче не могу. Но могу поразмышлять. В свое время я несколько лет изучал японский язык, и малеха знаний осталось. Почему вспомнил про японский? Просто "иероглифические" языки - самые толстые в плане "алфавита". Простая статистика. Школьный минимум по выпуску для японцев - около 10000 иероглифов. "Графоманы" могут использовать около 40000 шт.

                      Максимум можно рассчитать так. "Ключевых" (их называют ключи) иероглифов около 200, ну пусть 255. Позиций во "слово образовании" - три, левый один, и максимум два правых. В итоге получаем 255*255*255 = 16 581 375. Если тупо строить таблицу соответствий - сразу приходит на ум битовый массив. Итого 16581375/8=2072672. Два метра! Не двадцать пять!

                      Хорошо, берем китайскую письменность. Но и тут "сюрпризик" :lol: Иероглифы - те же "японские". А по сути наоборот. У японцев своей письменности нет - они используют "словообразующие" иероглифы именно китайские, только чтение свое. И тут, кстати, ньюанс. Составные иероглифы читаются "китайскими" "чтениями".

                      Вот два "толстых" алфавита мы оценили. Про корейсие иероглифы - ниче сказать не могу, тупо не в курсе. Остальная письменность - в большей части алфавитная, с достаточно ограниченным алфавитом. Арабская вязь, письменность Тайланда, и пр.пр

                      Вот такие размышления. Ну не должно быть там 25 метров!!! Ну не верю :lol:
                        Цитата Eric-S @
                        Добавлено
                        Цитата ЫукпШ @
                        Полагаю, что так и должно быть.

                        Нет. так не должно быть. Ибо:
                        во-первых внутреннее представление, не обязательно utf16le. Оно вобще когда-то было uc-2.
                        Во-вторых, конвертировать в utf16le из utf16be тоже надо.

                        Ошибаешься.
                        Можно посмотреть документацию на "MultiByteToWideChar" и понять,
                        что она может и для чего нужна.
                        А то, что надо конкретному юзеру, это его частные проблемы.
                        Удовлетворять все возможные потребности эта функция
                        не обещала.
                          Цитата JoeUser @
                          Про корейсие иероглифы - ниче сказать не могу...

                          Я слышал, что там всё те же самые китайские иероглифы. Они у них все одинаковые.
                          Сотни дальневосточных народов, сотни диалектов, сотни выговоров, но письменность одна.
                          Правда, у корейцев, собственный язык, и для него есть собственный, параллельный алфавит из 24 символов. Но буквы стилизованы под иероглифы.

                          Но, кхе... icu, а точнее unicode, разрабатывали кто попало и как попало. Это уж точно. Так что, сомневаюсь, что там, может быть какая-либо система. Даже нашу кирилицу и то добавляли кусками. Букву "ё" засунули в зад, а церковнославянские символы, вообще только недавно начали добавлять в пятую версию.
                          Ну и ожидаемо, что такое можно конвертировать только в лоб, суровым индуским быдлокодом.

                          Добавлено
                          Цитата ЫукпШ @
                          А то, что надо конкретному юзеру, это его частные проблемы.
                          Удовлетворять все возможные потребности эта функция
                          не обещала.

                          Мне собственно нужно:
                          1. считать текстовый файл. Скоррее всего он будет в ansi, возможно в utf-8.
                          2. преобразовать кодировку хранения, в широкие символы LPWSTR.
                          3. выполнить декомпозиционную нормализацию.
                          4. обработать текст.
                          5. и записать его в файл в кодировке utf-8 или ansi по выбору пользователя.
                          По моему MultiByteToWideChar тут подходит в самый раз.
                            Цитата Eric-S @
                            Я слышал, что там всё те же самые китайские иероглифы.

                            Не не не ... у корейцев - что то корейское :lol: Китайские иероглифы я б даже в печатной стилизации распознал. Там свое.
                              Цитата JoeUser @
                              Не не не ... у корейцев - что то корейское :lol: Китайские иероглифы я б даже в печатной стилизации распознал. Там свое.

                              У них две письменности. Но китайские иероглифы тоже юзают. http://ru.wikipedia.org/wiki/%D0%A5%D0%B0%D0%BD%D1%87%D0%B0
                              А так, в основном конечно юзают свою поделку https://ru.wikipedia.org/wiki/%D0%A5%D0%B0%...%8B%D0%BB%D1%8C
                              Сообщение отредактировано: Eric-S -
                                Цитата Eric-S @
                                Мне собственно нужно:
                                1. считать текстовый файл. Скоррее всего он будет в ansi, возможно в utf-8.
                                2. преобразовать кодировку хранения, в широкие символы LPWSTR.
                                3. выполнить декомпозиционную нормализацию.
                                4. обработать текст.
                                5. и записать его в файл в кодировке utf-8 или ansi по выбору пользователя.
                                По моему MultiByteToWideChar тут подходит в самый раз.

                                Да, это возможно.
                                Могу рекомендовать сделать класс-конвертер.
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0516 ]   [ 16 queries used ]   [ Generated: 23.04.24, 22:43 GMT ]