2013-01-22 2 views
1

В моей программе я использовал wstring, чтобы распечатать текст, который мне нужен, но он дал мне случайные шифры (из-за различной схемы кодирования). Например, у меня есть этот блок кода.какой язык поддерживает wstring?

wstring text; 
text.append(L"Some text"); 

Затем я использую directX для визуализации его на экране. Раньше я использовал wchar_t, но я слышал, что у него проблема с переносимостью, поэтому я переключился на swtring. wchar_t работал нормально, но казалось, что он только взял английский характер из того, что я могу сказать (распечатка просто полностью игнорирует введенный неанглийский символ), и это было нормально, пока я не переключился на wstring: у меня были только случайные шифры, похожие на китайские и Корейский смешанный. И, что интересно, мой компьютерный язык для текста, не являющегося unicode, является китайским. Основываясь на том, что я видел, я подозревал, что это правильно отображает китайский характер, поэтому я попытался, и он правильно отображает символ, но с квадратом впереди (что все еще выглядит некорректным отображением). Затем я предположил, что кодировка может зависеть от языкового стандарта, поэтому я переключил язык на английский (США) (я использую win8), затем я перезапускаю и вижу, что мой китайский тестовый символ в исходном файле стал некоторым случайным материалом (мой файл не сохраняется в формате unicode, так как все тексты на английском языке), то я попытался с английским символом, но не повезло, дисплей выглядел точно таким же и не имел никакого отношения к языку. Но я не понимаю, почему он не отображается правильно и выглядит как азиатский символ (даже я использую английский язык).

Должно ли быть сделано какое-то преобразование или я должен сохранить файл в другом формате кодировки? Проблема в том, что я хотел правильно отобразить английский charactore, который является значением по умолчанию.

+1

Абсолютный минимум Каждый разработчик программного обеспечения Абсолютно, положительно должен знать об Unicode и наборах символов: http://www.joelonsoftware.com/articles/Unicode.html –

+0

@Laurent, но как это помогает мне решить эту проблему? – ryf9059

+0

@ ryf9059: Он дает справочную информацию по этим типам проблем. –

ответ

0

Ошибка решена, она оказалась проблемой CASTING (не проблема с изображением, как было сказано ранее). прослушивают текст является промежуточным продуктом в течение некоторого внутреннего процесса преобразования с помощью swtringstream (который я забыл упомянуть), код выглядит следующим образом

wstringstream wss; 
wstring text; 
textToGenerate.append(L"some text"); 
wss << timer->getTime() 
text.append(wss.str()); 

Сразу после этого процесса отладчик показывает текст как кучу случайных вещей но позже как-то он преобразуется обратно, поэтому он читаем. Но проблема возникает на этапе рендеринга с использованием DirectX. Я почему-то оставил кастинг для wchar_t*, что приводит к неправильному рендерингу.

старый:

LPCWSTR lpcwstrText = (LPCWSTR)textToDraw->getText(); 

новый:

LPCWSTR lpcwstrText = (*textToDraw->getText()).c_str(); 

Изменяя, который решает эту проблему.

Итак, это результат плохой работы. Как-то люди исправляли мое заявление.

+0

Это совсем не похоже на проблему рендеринга. Это похоже на фиктивный литье. –

+1

Это не проблема рендеринга. В отличие от строк MFC, 'std: :(​​w) string' ** не может быть ** передан в' char * '/' wchar_t * '. Для этого существует функция 'c_str()'. –

1

В отсутствие кода, который демонстрирует вашу проблему, я дам вам соответствующий общий ответ.

Вы пытаетесь отображать английские символы, но видите иероглифы. Это происходит, когда вы передаете 8-битный ANSI-текст в API, который получает текст UTF-16. Ищите где-нибудь в своей программе, где вы делаете от char* до wchar_t*.

+0

Проблема решена! Оказывается, это рендеринг, но все же ваша информация полезна. Спасибо! :) – ryf9059

+0

Ох ... Это не проблема рендеринга, а проблема кастинга ... просто хотелось исправить это. – ryf9059

+0

И на самом деле мой ответ был довольно хорошим догадкой. ОК, дело не в том, что вы выбрали текст из ANSI, но вы выбрали из блока памяти, который содержит объект. –

0

Прежде всего, какой тип файла вы пытаетесь сохранить в тексте? Обычные файлы txt хранятся в ANSI по умолчанию (так же отлично). Поэтому, когда вы пытаетесь напечатать символ Unicode в ANSI-файле, он будет печатать нежелательные файлы. Два способа над приходом этой проблемы:

  1. попытки открыть файл в кодировке UTF-8 или 16 режиме, а затем написать
  2. конвертировать Unicode в ANSI перед записью в файле. Если вы используете окна, то MSDN предоставляет определенный API для преобразования Unicode в ANSI и наоборот. Если вы используете Linux, то Google для преобразования Unicode в ANSI. Там много решений.

Надеюсь, это поможет !!!

0

std::wstring не имеет никакой поддержки языкового стандарта/интернационализации. Это всего лишь контейнер для хранения последовательностей wchar_t.
Проблема с wchar_t заключается в том, что ее кодировка не определена. Это может быть Unicode UTF-16, Unicode UTF-32 или Shift-JIS, или что-то совершенно другое. В программе нет возможности рассказать.

У вас будут все шансы получить работу, если вы убедитесь, что кодировка исходного кода совпадает с кодировкой, используемой языковой версией, в которой будет работать программа.
Но использование сторонних библиотек (например, DirectX) может создавать дополнительные ограничения из-за возможных ограничений в том, какие кодировки ожидают и поддерживают эти библиотеки.

Смежные вопросы