Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Qt и кроссплатформенное программирование С/С++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.11.2013, 13:26   #1
gunsoy
Форумчанин
 
Регистрация: 30.12.2010
Сообщений: 280
Вопрос Кодировка строки

Здравствуйте.

Мне в проекте, в строках нужно использовать русские и английские буквы. Проект кроссплатформенный (Win, Lin, Android, IOS). Посоветуйте пожалуйста как мне кроссплатформенно использовать строки?

Спасибо за внимание.
gunsoy вне форума Ответить с цитированием
Старый 18.11.2013, 15:37   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Юникодом делай.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 18.11.2013, 20:07   #3
gunsoy
Форумчанин
 
Регистрация: 30.12.2010
Сообщений: 280
По умолчанию

Понятно что юникодом, но каким способом?

Вот я сделал с помощью std::wstring и wchar_t, в CodeBlocks во вкладке encoding установил utf-8. В общем работает, но будет ли работать на других платформах?

И потом мне ещё нужно будет отправить этот wstring сокетом по сети и на другом компе, возможно с другой ОС с помощью того же wstring отобразить. Подойдёт ли мне wstring или нужно будет использовать что-нибудь другое?
gunsoy вне форума Ответить с цитированием
Старый 18.11.2013, 20:22   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
но будет ли работать на других платформах?
Это надо проверять. Так не скажешь.
Цитата:
отправить этот wstring сокетом по сети
Ну тут вопрос интересный. Юникод юникоду рознь, допустим ты с BOM отправляешь, значит на той стороне это ВОМ должны понять. Все зависит от самого сервера, как он будет воспринимать юникод, и будет ли вообще.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 18.11.2013, 23:48   #5
Son Of Pain
Участник клуба
 
Регистрация: 23.12.2010
Сообщений: 1,129
По умолчанию

Я бы utf-8 использовал. Он на всех перечисленных платформах должен работать из коробки (кроме винды, afaik). Для windows придется преобразовывать в utf-16 при необходимости.

Для перекодировки можно взять вот эту либу - http://utfcpp.sourceforge.net/
она небольшая и умеет все что нужно. Ну или свою пару функций набросать.
Son Of Pain вне форума Ответить с цитированием
Старый 19.11.2013, 20:17   #6
gunsoy
Форумчанин
 
Регистрация: 30.12.2010
Сообщений: 280
По умолчанию

Спасибо всем за помощь. Попробую utf-8.

С кодировками в c++ никогда не работал, поэтому напишу что я собираюсь сделать.

Будет сервер на Линукс и клиент на (Win, Linux, IOS, Android). В проекте клиента перед отправкой данных на сервер произвожу перекодировку строки в utf-8 (если клиент на Windows, то наверное тоже utf-8 отправлять на сервер?). На сервере полученную строку, не производя никакой перекодировки отправляю всем клиентам. Если у клиента Windows произвожу перекодировку полученной строки в utf-16, иначе оставляю как есть. И вывожу полученную строку на экран.

Правильно ли я все понял?

Последний раз редактировалось Stilet; 20.11.2013 в 12:07.
gunsoy вне форума Ответить с цитированием
Старый 20.11.2013, 08:34   #7
ROD
Linux C++ Qt ARM
Старожил
 
Аватар для ROD
 
Регистрация: 30.11.2008
Сообщений: 3,030
По умолчанию

Цитата:
Правильно ли я все понял?
Нет. Вообще, протокол должен быть одинаковым для всех платформ. Т.е. везде следует гонять данные в одной кодировке (вне зависимости от того, какая используется в программе на этой платформе, в сетевом обмене везде должна быть одна и таже кодировка).
Дилетант широкого профиля.

"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс
ROD вне форума Ответить с цитированием
Старый 20.11.2013, 12:08   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Т.е. везде следует гонять данные в одной кодировке
Вот именно
Между прочем могу порекомендвать старенький base64. Раз он так популярен в е-мейле, почему в него не кодировать?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 20.11.2013, 12:46   #9
Son Of Pain
Участник клуба
 
Регистрация: 23.12.2010
Сообщений: 1,129
По умолчанию

Цитата:
Сообщение от ROD Посмотреть сообщение
Нет. Вообще, протокол должен быть одинаковым для всех платформ. Т.е. везде следует гонять данные в одной кодировке (вне зависимости от того, какая используется в программе на этой платформе, в сетевом обмене везде должна быть одна и таже кодировка).
Он так и написал, в общем-то. По сети везде гуляет utf-8, перекодировка производится только на клиенте для внутреннего представления при необходимости. Потому все верно.

Цитата:
Сообщение от Stilet Посмотреть сообщение
Между прочем могу порекомендвать старенький base64. Раз он так популярен в е-мейле, почему в него не кодировать?
Это же разные вещи. Бейс64 был придуман для "печатного" представления бинарных данных, а у топикстартера с этим проблем и так нет.

Да, кстати, в зависимости от задачи перекодировка в utf-16 может и не понадобиться. Если нужно просто вывести данные на экран - можно установить utf-8 в качестве multibyte charset в windows.

Последний раз редактировалось Stilet; 20.11.2013 в 14:23.
Son Of Pain вне форума Ответить с цитированием
Старый 20.11.2013, 14:13   #10
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,119
По умолчанию

gunsoy

Понятно что юникодом, но каким способом?

использовать utf-8

Вот я сделал с помощью std::wstring и wchar_t, в CodeBlocks во вкладке encoding установил utf-8. В общем работает, но будет ли работать на других платформах?

не будет.
размер wchar_t разный на windows и на linux, поэтому данные будут бинарно несовместимы.
Rififi вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Кодировка строки Alexandr5 C# (си шарп) 9 31.10.2013 17:52
Кодировка ~VL@D~ Windows 6 28.04.2013 17:45
Задача на строки. Даны две строки. Определить можно ли из символов первой строки получить вторую строку.( написать подпрограммой и ANTON1994 Паскаль, Turbo Pascal, PascalABC.NET 5 09.02.2013 14:07
Программа на языке "Ассемблер" - ввод строки, анализ длины строки, добавление точки в конец строки Алексей_2012 Помощь студентам 1 05.04.2012 11:26
Кодировка Predator199 PHP 0 17.03.2012 17:04