Компиляция Unicode с помощью Visual Studio 2019 - PullRequest
0 голосов
/ 17 июня 2020

Я пытаюсь скомпилировать этот код C ++ 17 на VS2019:

int main() {

  if(!testCodepointEncode(U'\u221A', '\xFB') ||
     !testCodepointEncode(U'\u0040', '\x40') ||
     !testCodepointEncode(U'\u03A3', '\xE4') ||
     !testCodepointEncode(U'?', '\xFE')) {
    return 1;
  }
  // Test 1 byte
  if(!testEncode("\u0040", "\x40")) {
    return 2;
  }

  // Test 2 byte
  if(!testEncode("\u03A3", "\xE4")) {
    return 3;
  }

  // Test 3 byte
  if(!testEncode("\u2502", "\xB3")) {
    return 4;
  }

  // Test 4 byte
  if(!testEncode("?", "\xFE")) {
    return 5;
  }

  if(!testArray("F ⌠ Z", "\x46\x20\xF4\x20\x5A")) {
    return 6;
  }

  if(!testView("F ⌠ Z", "\x46\x20\xF4\x20\x5A")) {
    return 7;
  }
  return 0;
}

Он компилируется и отлично работает с g cc и лязгает Linux, но MSV C жалуется:

UNICODE_TEST.CPP(65,27): error C2015: too many characters in constant 
UNICODE_TEST.CPP(75,18): warning C4566: character represented by universal-character-name '\u03A3' cannot be represented in the current code page (1252) 
UNICODE_TEST.CPP(80,18): warning C4566: character represented by universal-character-name '\u2502' cannot be represented in the current code page (1252)

Я попытался установить текущую кодовую страницу на UTF-8, но ошибки не исчезли.

Как можно скомпилировать этот код на Windows?

1 Ответ

1 голос
/ 17 июня 2020

Внимательно посмотрите, что вы делаете в этой строке:

if(!testEncode("\u03A3", "\xE4")) {

Ссылается на строковый литерал:

"\u03a3"

Вы пытаетесь express ввести символ UTF-16 внутри 8-битный строковый литерал (char *). Это просто не сработает. Это своего рода эквивалент:

char sz[2] = {0};
sz[0] = (char)(0x03a3);

И ожидание, что sz[0] будет содержать исходный символ UTF-16. Об этом и предупреждает компилятор.

Если вы хотите express 16-битный символ Юникода внутри строкового литерала, используйте широкую строку. Как показано ниже с префиксом L:

L"\u03a3"

Это строковый литерал, который содержит символ с широким набором символов: L"Σ"

И если мы действительно хотим быть pendanti c, мы могли бы сказать это переносимой express символьной строке UTF-16, используйте префикс u:

u"\u03a3"

Но на Windows wchar_t 16-битный, поэтому он не на самом деле не имеет значения.

Вероятно, вам нужно будет исправить ваши testEncode функции, чтобы они ожидали const wchar_t* вместо параметра const char*. (Я, честно говоря, не уверен, что делают ваши test* функции, но некоторые из ваших параметров выглядят подозрительно, если цель состоит в том, чтобы подтвердить преобразование UTF8 в UTF16)

Если вы хотите express UTF- 8 в коде можно сказать так:

"\xCE\xA3"

Выше приведено представление UTF-8 для символа сигмы Σ в виде строки UTF-8

...