Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.63/19: Рейтинг темы: голосов - 19, средняя оценка - 4.63
648 / 459 / 80
Регистрация: 26.10.2010
Сообщений: 1,263
Записей в блоге: 4
1

Конвертировать Utf 16 в Ansi

08.08.2012, 21:58. Просмотров 3420. Ответов 17
Метки нет (Все метки)

Есть у кого предложения по конвертации utf_16 в ansi?
Написанный мною индуский код не устраивает.

Функция:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
const String Utf16ToAnsi(String utf)
{
    String ret = "", lit = "";
    const int size = utf.Length() / 6;
    for(int i = 0; i < size; i++)
    {
        if ( i == 0 )
        {
            lit = "$" + utf.SubString(3,4);
        }else
        {
            lit = "$" + utf.SubString(((i+1)*4)+i+i-1,4);
        }
        ret += WideChar(StrToInt(lit));
    }
    return ret;
}
На входе:

C++
1
2
AnsiString s = "/u0417/u041E/u0416";
ShowMessage( Utf16ToAnsi(s) );
На выходе:

ЗОЖ
Добавлено через 1 час 44 минуты
Метод SubString() сам конвертирует.

C++
1
AnsiString s = "\u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440 \u0414\u0435\u043c\u0438\u0434\u0435\u043d\u043a\u043e";
C++
1
AnsiString g = "";
C++
1
2
    g =  s.SubString(1,s.Length());
    ShowMessage( g );
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.08.2012, 21:58
Ответы с готовыми решениями:

Конвертировать CSV ANSI в CSV UTF-8 или шо делать
Привет, есть проблема, импортирую данные из CSV в mssql через Винформс, все хорошо инсертится если...

Unicode, UTF-8 и ANSI в одном консольном приложении. Можно ли "на лету" конвертировать массив строк?
Всем доброго дня) Подскажите такую весчь: можно ли в консольном приложении работать с...

Конвертировать ANSI строку в UTF-8 строку
Всем привет! У меня встал вопрос о том, как мне можно сконвертировать ANSI строку в строку UTF-8....

Обработка .txt кодировка ANSI и UTF-8 (буква "я" в ANSI воспринимается как EOF)
Есть следующий кусок кода: FILE* fp = fopen(&quot;G:\OPND1.txt&quot;, &quot;r&quot;); if (fp!=NULL) // если файл...

17
LK
Заблокирован
08.08.2012, 23:06 2
http://googletest.googlecode.c... t-string.h
1
648 / 459 / 80
Регистрация: 26.10.2010
Сообщений: 1,263
Записей в блоге: 4
09.08.2012, 00:30  [ТС] 3
C++
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
const String __fastcall TForm1::Utf16ToAnsi(String utf)
{
 
  String ret = "", lit = "";
  const int size = utf.Length() / 6;
  const int pos = 0;
  int h = 0;
 
  if ( pos = utf.Pos( "\\u" ) )
  {
    for ( int i = 1; i < size+1; i++ )
    {
        h = utf.Pos( "\\u" );
 
        if ( h == 0 && utf.Length() > 0 )
        {
            ret += utf.SubString( 1, utf.Length() );
            break;
        }
        else if ( utf.Length() > 1 )
        {
            ret += utf.SubString( 1, h-1 );
            lit = "$" + utf.SubString( h+2, 4 );
            utf.Delete( 1, h+5 );
            h = 0;
            ret += WideChar( StrToInt(lit) );
        }
    }
  }else return utf;
  return ret;
}
Добавлено через 1 минуту
LK, вы проверяли ее работоспособность? Она мне еще днем казалось сомнительной.
0
1112 / 789 / 100
Регистрация: 01.02.2011
Сообщений: 1,829
Записей в блоге: 1
09.08.2012, 05:49 4
что-то не пойму, зачем эта функция,
ведь тип WideString представляет строки в кодировке UTF16 и этот тип можно преобразовать в AnsiString.
0
648 / 459 / 80
Регистрация: 26.10.2010
Сообщений: 1,263
Записей в блоге: 4
09.08.2012, 14:17  [ТС] 5
kzru_hunter, например.
0
1112 / 789 / 100
Регистрация: 01.02.2011
Сообщений: 1,829
Записей в блоге: 1
09.08.2012, 15:08 6
C++
1
2
        AnsiString s = "\u0417\u041E\u0416";
        ShowMessage(s); // выводит "ЗОЖ"
0
648 / 459 / 80
Регистрация: 26.10.2010
Сообщений: 1,263
Записей в блоге: 4
09.08.2012, 15:46  [ТС] 7
kzru_hunter, добавьте переменную s в Memo или ListView теперь.
0
1112 / 789 / 100
Регистрация: 01.02.2011
Сообщений: 1,829
Записей в блоге: 1
09.08.2012, 15:59 8
все ок:
C++
1
2
3
4
        AnsiString s = "\u0417\u041E\u0416";
        Memo1->Text = s; // в Memo вывелось "ЗОЖ"
        TListItem *item = ListView1->Items->Add();
        item->Caption = s; // в ListView появилась строка "ЗОЖ"
0
648 / 459 / 80
Регистрация: 26.10.2010
Сообщений: 1,263
Записей в блоге: 4
09.08.2012, 16:08  [ТС] 9
kzru_hunter, слева отключил функцию при выводе, с права включена.
0
Миниатюры
Конвертировать Utf 16 в Ansi  
1112 / 789 / 100
Регистрация: 01.02.2011
Сообщений: 1,829
Записей в блоге: 1
09.08.2012, 16:17 10
в 6-м билдере нормально выводится, в других надо будет проверить
0
648 / 459 / 80
Регистрация: 26.10.2010
Сообщений: 1,263
Записей в блоге: 4
09.08.2012, 16:31  [ТС] 11
kzru_hunter, в 2010 тоже нормально выводит таким образом:

C++
1
2
3
4
   AnsiString s = "\u0417\u041E\u0416";
        Memo1->Text = s; // в Memo вывелось "ЗОЖ"
        TListItem *item = ListView1->Items->Add();
        item->Caption = s; // в ListView появилась строка "ЗОЖ"
0
1112 / 789 / 100
Регистрация: 01.02.2011
Сообщений: 1,829
Записей в блоге: 1
09.08.2012, 16:46 12
в BuilderXE тоже все ок.

Цитата Сообщение от QVO Посмотреть сообщение
в 2010 тоже нормально выводит таким образом
в каком тогда случае не так выводится?
0
648 / 459 / 80
Регистрация: 26.10.2010
Сообщений: 1,263
Записей в блоге: 4
09.08.2012, 17:20  [ТС] 13
C++
1
2
3
4
5
6
7
8
9
void Func(UnicodeString &h)
{
// парсим текст
// удаляем отработаное
Func(h);
}
//...
UnicodeString h = "\u0417\u041E\u0416";
Func(h);
0
1112 / 789 / 100
Регистрация: 01.02.2011
Сообщений: 1,829
Записей в блоге: 1
09.08.2012, 17:36 14
Цитата Сообщение от QVO Посмотреть сообщение
// парсим текст
// удаляем отработаное
где-то тут наверное ошибка
0
648 / 459 / 80
Регистрация: 26.10.2010
Сообщений: 1,263
Записей в блоге: 4
09.08.2012, 17:40  [ТС] 15
kzru_hunter,

C++
1
2
3
4
5
6
7
8
9
10
find = "user_name";
search = fr_list.Pos(find);
if ( fr_list.SubString(search,find.Length()) == find ) {
frLIST[i].user_name = Utf16ToAnsi(fr_list.SubString( search+3+find.Length(), fr_list.SubString( search+3+find.Length(), fr_list.Length() ).Pos('"')-1 ));
//ListItem->SubItems->Add(Utf16ToAnsi(fr_list.SubString( search+3+find.Length(), fr_list.SubString( search+3+find.Length(), fr_list.Length() ).Pos('"')-1 )));
}else {return ;}
 
fr_list.Delete(1, search);
 
Find(fr_list);
0
1112 / 789 / 100
Регистрация: 01.02.2011
Сообщений: 1,829
Записей в блоге: 1
09.08.2012, 17:57 16
так мозг можно сломать
я бы в коде заменил:
C++
1
if ( fr_list.SubString(search,find.Length()) == find ) {
на
C++
1
if ( search ) {
, т.к. делает тоже самое, что и верхняя строка

и возможно тут ошибка появляется:
C++
1
Pos('"')
я бы заменил на
C++
1
Pos(L"\"")
1
648 / 459 / 80
Регистрация: 26.10.2010
Сообщений: 1,263
Записей в блоге: 4
09.08.2012, 18:08  [ТС] 17
kzru_hunter,
C++
1
if ( fr_list.SubString(search,find.Length()) == find ) {
На 99% уверен что не выдаст ерунду, т.к. ищу не только user_name.
C++
1
Pos(L"\"")
К сожалению никаких изменений.
0
1112 / 789 / 100
Регистрация: 01.02.2011
Сообщений: 1,829
Записей в блоге: 1
09.08.2012, 18:20 18
я бы под отладчиком прошелся и посмотрел, где начинается баг.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.08.2012, 18:20

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

Из ANSI в UTF-8
Привет! Ищу скрипт который будет преобразовать файлы из ANSI(Windows-1251) в UTF-8. Пробовал...

Кодировка ANSI в UTF-8
Здравствуйте. Кодирую текстовый файл. Файл типа txt с кодировкой utf-8. Загружаю в массив...

ANSI или UTF-8
Доброго времени суток! Народ в чем отличие ANSI от UTF-8 при разработке сайтов, просто с UTF-8 у...

Перевод из Ansi в UTF-8
Как перевести строку из Ansi в UTF-8?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.