Как открыть станд.:: fstream (ofstream или ifstream) с unicode именем файла?

Изображение, которое вы загрузили, показывает, что вы на самом деле запускаете несколько потоков, но культура устанавливается только для текущего потока.

Чтобы преодолеть это, вы можете присвоить желаемую культуру переменной и использовать ее внутри Task.Factory.StartNew. Вы можете сделать что-то вроде этого:

var culture = new System.Globalization.CultureInfo("en-US");
return Task.Factory.StartNew(() => 
{
    // use culture here
    Thread.CurrentThread.CurrentCulture = culture;

    // your actual code here
    String i = "0.48,trx/btc,coss,hitbtc2,0.0000062000 / 0.0000066000,0.0000061502 / 0.0000061701,,0.48%";
    double test = double.Parse(i.Split(',')[0]);
});

Как указал @madreflection, вы можете просто передать желаемую культуру методу double.Parse():

// put this at the top of your file
var culture = new System.Globalization.CultureInfo("en-US");

// use this inside Task.Factory.StartNew
double test = double.Parse(i.Split(',')[0], culture);

Или даже использовать CultureInfo.InvariantCulture внутри Task.Factory (спасибо @Olivier):

double test = double.Parse(i.Split(',')[0], CultureInfo.InvariantCulture);
49
задан Extreme Rationalist 4 May 2009 в 09:56
поделиться

2 ответа

Стандартная библиотека C ++ не поддерживает Unicode. char и wchar_t не обязательно должны быть кодировками Unicode.

В Windows wchar_t - это UTF-16, но прямой поддержки UTF-8 нет. имена файлов в стандартной библиотеке (тип данных char не является Unicode в Windows)

В MSVC (и, следовательно, в Microsoft STL) предоставляется конструктор для файловых потоков, который принимает const wchar_t * имя файла, позволяющее создать поток как:

wchar_t const name[] = L"filename.txt";
std::fstream file(name);

Однако эта перегрузка не указана в стандарте C ++ 11 (она гарантирует только наличие версии на основе char ). Он также отсутствует в альтернативных реализациях STL, таких как GCC libstdc ++ для MinGW (-w64), начиная с версии g ++ 4.8.x.

Обратите внимание, что точно так же, как char в Windows не является UTF8, в других ОС wchar_t может не быть UTF16. В общем, это вряд ли будет портативным. Открытие потока с именем файла wchar_t не определено в соответствии со стандартом, и указание имени файла в char s может быть затруднено, поскольку кодировка, используемая char, варьируется в зависимости от ОС.

56
ответ дан 7 November 2019 в 11:50
поделиться

В текущих версиях Visual C ++ метод std :: basic_fstream имеет метод open () , который принимает wchar_t * в соответствии с http://msdn.microsoft .com / EN-US / библиотека / 4dx08bh4.aspx .

3
ответ дан 7 November 2019 в 11:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: