LINUX.ORG.RU

У венды консоль не юникодная. Видимо вайн умеет выхлапывать с учётом локали, а ты - нет.

anonymous
()
Ответ на: комментарий от anonymous

Тогда же почему вот эта строка TCHAR CONST szMsgTmpl[] = L"FindFirstFile() failed, " собранная в Visual Studio делает в консоль венды нормальный выхлоп? И не вайн выводит, а венда запускающая файл от вайна.

steemandlinux ★★★★★
() автор топика
Последнее исправление: steemandlinux (всего исправлений: 1)
Ответ на: комментарий от steemandlinux

А ты правильные функции используешь? Там есть FunctionW и FunctionA, в заголовочниках определены макросы Function, которые вызывают FunctionW/FunctionA в зависимости от того, определен литерал UNICODE (вроде) или нет.

anonymous
()

Не так чтобы это сделает что-то совместимым (также не понял чем выводится строка на консоль), но может -fshort-wchar поможет.

xaizek ★★★★★
()
Ответ на: комментарий от anonymous

Ну и если уж TCHAR используешь, то лучше пользоваться макросом T(), так как TCHAR может быть как char, так и wchar_t

anonymous
()
Ответ на: комментарий от anonymous

http://eax.me/winapi-console-app/ вот например. Начиная с того, что mingw в упор не хочет выполнять typedef wchar_t TCHAR; а выполняет typedef char TCHAR; кончая тем, что он создает UTF-8 строки, а не UTF-16 даже при явном указании wchar_t.

steemandlinux ★★★★★
() автор топика
Ответ на: комментарий от steemandlinux

TCHAR - это не wchar_t. Это условный тип, он зависит от того, определен ли UNICODE. Этот тип определен примерно так: #ifdef UNICODE #define TCHAR wchat_t #else #define TCHAR char #endif

Поэтому с ним стоит использовать макрос T() #ifdef UNICODE #define T(t) L##t #else #define T(t) t #endif

anonymous
()
Ответ на: комментарий от anonymous
TCHAR CONST szMsg[] = T("What's your name?\n");
1.c:5:1: error: invalid initializer
 TCHAR CONST szMsg[] = T("What's your name?\n");
steemandlinux ★★★★★
() автор топика
Ответ на: комментарий от steemandlinux

Тогда используй WCHAR, LPWSTR и подобные, а не TCHAR, LPTSTR и определи UNICODE - #define UNICODE перед заголовочными файлами или в параметрах сборки.

anonymous
()
Ответ на: комментарий от anonymous

И лучше тогда явно вызывать функции с суффиксом *W (так хотя бы будет видно, может быть такая функция вообще не определена).

anonymous
()
Ответ на: комментарий от anonymous

Вот переписал, варнинги пропали. Но всё равно строки в кодировке UTF-8, а не UTF-16.

#include <windows.h>
#include <wchar.h>

#define STRLEN(x) (sizeof(x)/sizeof(TCHAR) - 1)
const WCHAR szMsg[] = L"What's your name?\n";

void ChangeTextColor(HANDLE hSomeHandle) {
  INT nArgs = 0;
  LPWSTR lpCommandLine = GetCommandLine();
  LPWSTR* lpArgs = CommandLineToArgvW(lpCommandLine, &nArgs);
  if(nArgs >= 2 && 0 == lstrcmpiW(lpArgs[1], L"green")) {
    SetConsoleTextAttribute(hSomeHandle, FOREGROUND_GREEN);
  }
  LocalFree(lpArgs);
}

int main() {
  HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
  HANDLE hStdin = GetStdHandle(STD_INPUT_HANDLE);
  WCHAR szName[16];
  WCHAR szResp[32];
  DWORD dwCount = 0;

  ChangeTextColor(hStdout);

  WriteConsole(hStdout, &szMsg, STRLEN(szMsg), &dwCount, NULL);
  ReadConsole(hStdin, &szName, STRLEN(szName), &dwCount, NULL);

  if(dwCount >= 2 &&
    '\n' == szName[dwCount-1] &&
    '\r' == szName[dwCount-2]) {
    szName[dwCount-2] = '\0';
  } else if(dwCount > 0) {
    szName[dwCount] = '\0';
  }

  wsprintfW(szResp, L"Hello, %s!\n", szName);
  WriteConsole(hStdout, &szResp, lstrlenW(szResp), &dwCount, NULL);

  ExitProcess(0);
}
steemandlinux ★★★★★
() автор топика
Ответ на: комментарий от Harald

Я пробовал сохранять как UTF-16LE, команда

i686-pc-mingw32-gcc -finput-charset=UTF-16LE -o hello.exe hello.c

выложила кучу ошибок.

steemandlinux ★★★★★
() автор топика
Ответ на: комментарий от steemandlinux

Заменить WriteConsole/ReadConsole на WriteConsoleW/ReadConsoleW или добавить перед #include <windows.h>

#define UNICODE
#define _UNICODE

anonymous
()
Ответ на: комментарий от kiotoze

Да я из неё и узнал что мне utf16 нужен, а не ansi.

steemandlinux ★★★★★
() автор топика
Ответ на: комментарий от anonymous

с учётом локали

виндовкая консоль от локали не зависит - по дефолту code page 866. Меняется в рантайме через api винды

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.