0

我正在编写一些从 XLS 文件中获取行并将它们插入数据库的软件。

在 OpenOffice 中,单元格如下所示:

Brunner Straße, Parzelle

我正在使用 CodeProject 中的 ExcelFormat 库。

int type = cell->Type();
cout << "Cell contains " << type << endl;
const char* cellCharPtr = cell->GetString();
if (cellCharPtr != 0) {
  value.assign(cellCharPtr);
  cout << "normal string -> " << value << endl;
}

使用库获取的字符串作为 char* 返回(因此 cell->Type() 返回 STRING,而不是 WSTRING),现在看起来像这样(在控制台上):

normal string -> Brunner Stra�e, Parzelle
hex string -> 42 72 75 6e 6e 65 72 20 53 74 72 61 ffffffdf 65 2c 20 50 61 72 7a 65 6c 6c 65 

我使用 mysql cpp 连接器将其插入数据库,如下所示:

prep_stmt = con -> prepareStatement ("INSERT INTO "
                  + tablename 
                  + "(crdate, jobid, imprownum, impid, impname, imppostcode, impcity, impstreet, imprest, imperror, imperrorstate)"
                  + " VALUES(?,?,?,?,?,?,?,?,?,?,?)");

<...snip...>

prep_stmt->setString(8,vals["street"]);

<...snip...>

prep_stmt->execute();

将其插入具有 utf8_general_ci 排序规则的数据库后,它看起来像这样:

Brunner Stra

这很烦人。

当从 xls 文件中检索字符串时,如何确保文件所在的任何语言环境都转换为 utf-8?

这将作为 Web 服务的后端运行,客户可以在其中上传自己的 excel 文件,因此恐怕“更改 Libre Office 中文件的编码”无法正常工作。

4

1 回答 1

1

您的输入似乎以 latin1 编码,因此您需要将 mysql“连接字符集”设置为latin1.

我不熟悉您用来连接 MySQL 的 API。在其他 API 中,您将添加charset=latin1到连接 URL 或调用 API 函数来设置连接编码。

或者,您可以在将输入提供给 MySQL 之前对其进行重新编码。

于 2013-01-23T16:53:46.593 回答