gpt4 book ai didi

sqlite - 使用 System.Data.SQLite 支持长 unicode 文件路径

转载 作者:行者123 更新时间:2023-12-03 17:00:11 24 4
gpt4 key购买 nike

我正在开发一个需要能够在用户定义的路径中创建和操作 SQLite 数据库的应用程序。我遇到了一个我不太明白的问题。我正在用巨大的笨拙的 unicode 路径针对一些非常粗略的样本数据测试我的东西,其中大多数没有问题,但有一个问题。

一个工作连接字符串的例子是:

Data Source="c:\test6\意外な高価で売れるかも? 出品は手順を覚えれば後はかんたん!\11オークションストアの出品は対象外とさせていただきます。\test.db";Version=3;

虽然失败的是
Data Source="c:\test6\意外な高価で売れるかも? 出品は手順を覚えれば後はかんたん!\22今やPCライフに欠かせないのがセキュリティソフト。そのため、現在何種類も発売されているが、それぞれ似\test.db";Version=3;

由于我无法控制的原因,我正在使用 System.Data.SQLite v1.0.66.0,但我很快用最新的 v1.0.77.0 进行了测试,并且遇到了同样的问题。

无论是在尝试新创建 test.db 文件时,还是如果我手动将一个文件放在那里并尝试打开,SQLiteConnection.Open 都会抛出一个异常,仅显示“无法打开数据库文件”,堆栈跟踪显示它实际上是系统.Data.SQLite.SQLite3.Open 即抛出。

有什么办法可以让 System.Data.SQLite 很好地使用这些路径?一种解决方法可能是在临时位置创建和操作我的数据库,然后将它们移动到实际位置进行存储,因为否则我可以正常创建和操作文件。不过,这是最后的手段。

谢谢你。

最佳答案

我猜你在日文语言环境机器上,默认系统编码(ANSI 代码页)是 cp932 日文(≈Shift-JIS)。

第二条路径包含:



编码为字节序列:
0x83 0x5C

Shift-JIS 是一种多字节编码,其不幸的特性是有时会在尾字节中重复使用 ASCII 代码单元。在这种情况下,它使用了对应于反斜杠 \ 的字节 0x5C . (尽管出于历史原因,这通常以日文字体显示为日元符号。)

因此,如果将此路径名传递到基于字节的 API 中,它将在 ANSI 代码页中进行编码,并且您将无法区分作为目录分隔符的反斜杠和作为副作用的反斜杠之间的区别多字节编码。因此,当使用基于字节的 IO 方法访问时,任何包含以下字符之一的路径都将失败:
―ソЫⅨ噂浬欺圭構蚕十申曾箪貼能表暴予禄兔喀媾彌拿杤歃畚秉綵臀藹觸軆鐔饅鷭偆砡纊犾

(此外,任何包含 cp932 中不存在的 Unicode 字符的路径名自然会失败。)

看起来 SQLite 在幕后使用基于字节的 IO 方法来打开给定的文件名。这是不幸的,但在跨平台代码中非常常见,因为 POSIX C 标准库被定义为使用基于字节的文件名来执行文件 open() 等操作。 .

因此,使用 C stdlib 函数不可能可靠地访问具有非 ASCII 名称的文件。这种可悲的情况会继承到使用 stdlib 编写的各种跨平台库和语言中;只有特定支持 Win32 Unicode 文件名的工具(例如 Python)才能可靠地访问 Windows 下的所有文件。

那么,您的选择是:
  • 根据移动/重命名建议,避免在数据库的路径名中使用非 ASCII 字符;
  • 继续依赖系统语言环境为日语(ANSI 代码页 = 932),并且只需重命名文件以避免上面列出的任何字符;
  • 获取相关文件的短 (8.3) 文件名并使用它来代替真实文件名——类似于 c:\test6\85D0~1\22PC~1\test.db .您可以使用 dir /x查看短文件名。它们始终是纯 ASCII,避免了编码问题;
  • 添加一些代码以使用 GetShortPathName 从真实文件中获取短文件名。这是一个 Win32 API,所以你需要一点 help从.NET 调用它。另请注意,如果在禁用短文件名生成功能的机器上运行,短文件名仍然会失败;
  • 说服 SQLite 添加对 Windows Unicode 文件名的支持;
  • 通过将字节接口(interface)的默认编码设置为 UTF-8 来说服微软一劳永逸地解决这个问题,就像在所有其他现代操作系统上一样。
  • 关于sqlite - 使用 System.Data.SQLite 支持长 unicode 文件路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8857221/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com