После долгих поисков я начал использовать этот странный код:
ofstream myfile;
string chars = "абвгдеёжзийклмнопрстуфхцчшщъыьэюя";
myfile.open ("alphabet.txt");
for (int i = 0; i < 66; i+=2) {
myfile << chars[i] <<chars[i+1] << "\n";
}
myfile.close();
Но неужели нет способа получить широкий символ из std::string?
Я знал об этом, но почему нет встроенного метода получения таких писем?!
В библиотеке C++ есть несколько классов для транскодирования между различными кодировками и Unicode, но они неудобны в использовании и не очень популярны. Большинство приложений, которые должны иметь дело с Unicode, будут использовать для этого одну из нескольких библиотек, например iconv
.
@DmitrySokolov Я думаю, потому что C++ предшествовал широкому распространению Unicode.
Это сработало на моей машине. Мой файл исходного кода находится в UTF-8. Строка находится в UTF-16. Вывод в UTF-16LE.
Со временем C++ стал немного лучше обрабатывать строки Unicode, но все еще имеет много возможностей для улучшения.
#include <fstream>
#include <string>
using std::ofstream;
using std::string;
int main() {
auto chars = u"абвгдеёжзийклмнопрстуфхцчшщъыьэюя";
auto myfile = ofstream("alphabet.txt");
for (char16_t const* p = chars; *p; ++p) {
auto c = *p;
auto cc = reinterpret_cast<char const*>(&c);
myfile.write(cc, sizeof c);
}
myfile.close();
}
std::string
содержитchar
s, всегда содержалchar
s и всегда будет содержатьchar
s. Для нелатинских символов одним из вариантов является использование региональных кодировок, таких как KOI8-R, однако использованиеKOI8-R
и других наборов символов со временем устарело, а современные реализации C++ обычно по умолчанию используют многобайтовую кодировку UTF-8 для представления нелатинских символов. символов, где каждый символ, например "б", представлен многобайтовой последовательностью.