Интерпретация буквальных цепей с префиксом размера L, или, Или, u8 внутри файлов шрифт

Я делаю tokenizador кода C ++, использую C ++ :-)

На данный момент, только я выношу файлы шрифт, кодировавшие в UTF8, так что, чтобы обрабатывать файл ввода, я читаю линию в линию и использую простого const char * чтобы соглашаться на каждый индивидуальный характер.

Чтобы обнаруживать буквальные цепи с префиксом, я использую следующее:

static size_t parseIdentifier( CppToken &tk, const char *beg, const char *end ) {
  while( ( ( beg != end ) && *beg <= ' ' ) ) ++beg;

  if( beg == end ) return 0;

  if( strncmp( beg, "L\"", 2 ) { return parseStringLiteralL( tk, beg, end ); }
  if( strncmp( beg, "u\"", 2 ) { return parseStringLiteralu( tk, beg, end ); }
  if( strncmp( beg, "U\"", 2 ) { return parseStringLiteralU( tk, beg, end ); }

  ...
}

И здесь - мое сомнение: внутри этих функций parseStringLiteralX( ), цепи в файле шрифт с префиксом размера: я должен интерпретировать, что они продолжают быть кодировавшими в UTF8, или наоборот они должны быть заблаговременно кодировавшими согласно использованному префиксу?

Документация, которую я нашел, не объясняет мне, что делать:

Phase 5

1) All characters in character literals and string literals пахал converted from the source character set to the execution character set (which май be в мультибайт character set such эксперт UTF-8, эксперт long эксперт the 96 characters of the basic source character set listed in phase 1 have single-байт representations).

И не, как применение этого к моим функциям parseStringLiteralX( ). А именно, различные функции были бы должны начинаться так, с превращением типов:

static size_t parseStringLiteralL( CppToken &tk, const char *beg, const char *end ) {
  const wchar_t *wbeg = reinterpret_cast< const wchar_t * >( beg );
  const wchar_t *wend = reinterpret_cast< const wchar_t * >( end );
  ...
}

или, наоборот, я должен понимать, что буквальные цепи остаются в UTF8, и я тот, кто должен преобразовывать их в тип, показанный префиксом?

static size_t parseStringLiteralL( CppToken &tk, const char *beg, const char *end ) {
  std::wstring value;

  while( *beg != '"' ) value.append( 1, utf8_to_wchart( *beg ) );

  ...
}

Заметь: реальный исходный код не является таким, только иллюстративный.

Я ИЗДАЮ

Я попробовал это маленькое доказательство это, чтобы пробовать прояснять:

#include <string>
#include <iostream>

int main( ) {
  const wchar_t *test = L"el niño y la niña\n";

  std::cout << reinterpret_cast< const char * >( test ) << '\n';
  std::wcout << test << std::endl;

  return 0;
}

Он надеялся, что текст является правильно как минимум 1 разом. Однако, я получаю следующее:

и
ni�o и она ni�a

Ну, я только что упал к, что будет зависеть от кодирования, которое вынесет WandBox..., но там я это оставляю, если он он полезный в кого-то.

5
задан 23.04.2019, 12:15
0 ответов