1

我在我的 Mac 上创建了一些 .txt 文件(起初并不认为这很重要,但是......)以便我可以在我正在(不幸的是)另一台计算机上的 Visual Studio 中制作的应用程序中读取它们。它们基本上是充满记录的文件,每行的条目数在顶部,例如:

2
int int 
age name
9 Bob
34 Mary
12 Jim
... 

在我最初在 Mac 上制作(并成功测试)的代码中,我尝试读取此文件和类似文件:

Table TableFromFile(string _filename){ //For a database system

  ifstream infile; 
  infile.open(_filename.c_str()); 

  if(!infile){
    cerr << "File " << _filename << " could not be opened."; 
    exit(1); 
  }

  //Determine number attributes (columns) in table, 
  //which is number on first line of input file 
  std::string num;
  getline(infile, num); 
  int numEntries = atoi(num.c_str()); 
  ...
  ... 

简而言之,这会导致崩溃!当我研究它时,我发现了一些有趣的“读取字符串字符时出错”问题,并发现它numEntries得到了一些疯狂的负垃圾值。这似乎是由于从第一行读取的“num”应该只是“2”,实际上是“ÿþ2”。

通过一些研究,似乎这些奇怪的字符正在格式化......也许是 unicode/Mac 特定的?无论如何,它们都是一个问题,我想知道是否有一种快速简便的方法可以让我在 Mac 上创建的文本文件像在 Mac 终端中一样在 Windows 中协作和运行。我尝试连接到一台 UNIX 机器,将一个 txt 文件放在那里,在其上运行 unix2dos,然后放回 VS,但无济于事……仍然是行首的那些符号!我应该在 Windows 中重新输入文件吗?我很惊讶地发现,当涉及到跨平台文件中的字符时,您所看到的并不总是您所得到的……但我想这是一个很好的教训。

4

1 回答 1

2

正如评论者所指出的,您看到的字节是字节顺序标记。请参阅http://en.wikipedia.org/wiki/Byte_order_mark

“ÿþ”是 0xFFFE,UTF-16“小端序”字节顺序标记。“2”是您的第一个实际字符(对于 UTF-16,256 以下的字符将由 0xnn00; 的字节表示,其中“nn”是该字符的常用 ASCII 或 UTF-8 代码,所以试图将字节读取为 ASCII 或 UTF-8 会正常,直到它到达第一个空字节)。

如果您需要解开文本文件的 Unicode 细节,我所知道的最好的工具是免费的 SC Unipad 编辑器 (www.unipad.org)。它仅适用于 Windows,但几乎可以读取和写入任何编码,并且能够告诉您有关该文件的信息。它非常擅长猜测编码。

Unipad 将能够打开文件并让您以任何您想要的编码保存它:ASCII、UTF-8 等。

于 2013-03-02T12:57:09.767 回答