如何打印c+;中文本文件中的非英语字符+;? 我正在尝试编写一个简单的C++程序。p>

如何打印c+;中文本文件中的非英语字符+;? 我正在尝试编写一个简单的C++程序。p>,c++,visual-studio,file,utf-8,C++,Visual Studio,File,Utf 8,目标:打开一个现有的文本文件,获取名称和姓氏,并将它们保存到名称和姓氏字符串中。打印姓名并跳到下一行。重复此操作,直到文件结束 我有两个问题 我正在使用windows 8.1和visual studio 2017的最新更新 主要代码如下: #include <stdio.h> #include <stdlib.h> #include <string> #include "stdafx.h" #include <iostream> using nam

目标:打开一个现有的文本文件,获取名称和姓氏,并将它们保存到名称和姓氏字符串中。打印姓名并跳到下一行。重复此操作,直到文件结束

我有两个问题

我正在使用windows 8.1和visual studio 2017的最新更新

主要代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string>
#include "stdafx.h"
#include <iostream>
using namespace std;


int main() {
FILE *fPtr;



if ((fPtr = fopen("newStudentsList.txt", "r")) == NULL) {
    cout << "File could not be opened.\n";
    system("pause");
}


else {
    char *name = new char[100];
    char *surname = new char[100];

    rewind(fPtr);

    while (!feof(fPtr)) {

        fscanf(fPtr, "%s\t%s\n", name, surname);
        cout << name << " " << surname << endl;
    }

    system("pause");
}
return 0;
}
#包括
#包括
#包括
#包括“stdafx.h”
#包括
使用名称空间std;
int main(){
文件*fPtr;
if((fPtr=fopen(“newStudentsList.txt”,“r”))==NULL){

首先,在C++程序中不要使用C函数。C++有不同的特性、不同的抽象和不同的库。使用C构造阻止使用它们。

C++用于通过网络等对文件、内存和字符串缓冲区进行读/写。它有大量的算法,需要流和/或迭代器作为输入

它还有内置的字符串类型,可以处理单字节(std::string)、多字节(std::wstring)、UTF16(std::u16string)和UTF32(std::u32string)库。您可以在代码中指定这些类型。它甚至有一种带有关键字的类型推断形式

C++仍然没有UTF8的类型。程序员应将UTF8字符串和文件视为单字节数据,并使用
char
std::string
存储它们。这些值应根据需要转换为其他代码页或Unicode类型

这意味着在控制台上显示UTF8文件的内容时,您不需要做更多的事情。代码取自教程:

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int main () {
  string line;
  ifstream myfile ("newStudentsList.txt");
  if (myfile.is_open())
  {
    while ( getline (myfile,line) )
    {
      cout << line << '\n';
    }
    myfile.close();
  }

  else cout << "Unable to open file"; 

  return 0;
}
在运行应用程序之前。UTF8字符串应正确显示,前提是控制台字体包含正确的字符

更新

可以指定UTF8文本,但存储仍然是
char
,例如:

const char* str1 = u8"Hello World";  
const char* str2 = u8"\U0001F607 is O:-)";  
const char*     s3 = u8"Whenever I have a need to output non-ASCII characters in my console programs I just set the console mode to support UNICODE:

_setmode(_fileno(stdout), _O_U16TEXT);
const char*str1=u8“你好世界”;
常量字符*str2=u8“\U0001F607为O:-)”;

const char*s3=u8“每当我需要在控制台程序中输出非ASCII字符时,我只需将控制台模式设置为支持UNICODE:

std::wcout << L"\x046C" << std::endl;
wprintf(L"\x046C\n");
完成此操作后,宽字符识别代码“按预期”工作,即此代码:

#include <io.h>
#include <fcntl.h>
这里有一个简短的测试程序供您使用:

#包括
#包括
#包括
#包括
void main(){
_setmode(_fileno(stdout),_O_16text);

请一次只问一个问题,看看为什么我们不使用fstream来处理这个文件而不是使用c风格的文件。这将是efficiency@J.Snipe这是无关紧要的。你应该问每个问题1个问题。@ j.SNIPE混合C和C++特征是一个非常糟糕的想法。你应该使用打开/写入文件,如图所示。你可以使用<代码>>ifstream
读取非Unicode文件,无论编码如何。您可以使用
wifstream
读取UTF16文件。UTF8文件将被处理as@J.Snipe然后使用它读取STD::字符串和字符数据。C++仍然没有UTF8字符串的特殊类型。UTF8文件应该像ASCII文件一样被读取和处理。谢谢你的正确的A。nswer。我无法获取最后一部分。在运行程序之前,我应该在控制台窗口中的何处键入chcp 65001?这允许控制台为您的文本使用正确的代码页。OP读取的是UTF8字符,而不是UTF16。
wcout
wprintf
等用于双字节字符和UTF16。在C++11及更高版本中UTF16的绳索类型为char16_t、U16串
#include <io.h>
#include <fcntl.h>
#include <conio.h>
#include <iostream>
#include <io.h>
#include <fcntl.h>
void main(){
    _setmode(_fileno(stdout), _O_U16TEXT);
    std::wcout << L"\x046C" << std::endl;
    wprintf(L"\x046C\n");
}