【问题标题】:vb6: how detect if string is unicodevb6:如何检测字符串是否为 unicode
【发布时间】:2017-09-22 09:05:06
【问题描述】:

我正在开发一个需要检测字符串是否为 Unicode 的函数。

我从 Access DB 中获取此字符串。

现在我每两个字节分析一次:如果秒为 00,则为 Unicode,但并非总是如此;有时我有几个字节为&H2&HA1

我该如何解决这个问题?

【问题讨论】:

  • 您阅读的是 NVARCHAR 还是 VARCHAR? NVARCHAR 是 unicode,VARCHAR 是 ASCII
  • 它不是 nvarchar 或 varchar.. 是一个 ole 对象:过去有人采用字节数组,将其转换为 unicode 字符串并将其复制到 db 字段(ole 对象)中。当我们开始更改机器中的字符集表时,问题就来了:获取访问 db 字段值,将其从 unicode 转换为更改字节数组值。将值转换为正确的表是不可能的(由于我们的系统),但我需要检查一个字符串是否被转换为 unicode
  • 如果您谈论的是 String 数据类型,自 VB4 以来,它一直是 Unicode 字符集的 UTF-16(或其前身 UCS-2)编码。如果数据库列是 NVARCHAR,那么一旦您在 String 中有文本,这就是同一件事但不相关 - 除非构造字符串的任何东西做错了。每个字符都是 Unicode。那么,您的问题是什么?
  • 顺便说一句——微软已经以各种方式使用“Unicode”作为 UTF-16 或 UCS-2 的名称。它们是 Unicode 字符集的几种编码之一。

标签: unicode vb6


【解决方案1】:

只有从 0 到 127 的字符是“安全的”。从 128 到 255 的 ANSI 字符值在不同的语言环境中具有不同的含义和字符映射。

例如,在美国英语语言环境中:

Option Explicit

Private Sub Form_Load()
    Dim S As String

    S = "‰"
    Debug.Print S, Asc(S), AscW(S)
End Sub

生产:

‰              137           8240 

【讨论】:

  • 这里唯一“不安全”的是 Asc 函数,在大多数情况下使用它毫无意义。字符串是 UTF-16 代码单元的计数序列。 "" 是一个 UTF-16 文字。 AscW 获得第一个代码单元(该字符串中恰好只有一个)。提问者应该检查 Asc 和 Chr 的存储和检索代码,并考虑如何修复它们的损坏——如果已经存储的数据甚至可以做到的话。
  • Asc 不是不安全的,它只是在报告值之前转换为 ANSI。当然,不能映射到当前 ANSI 代码页的字符会被更改为“splat”(通常是 ? 字符)。
【解决方案2】:

如果基础数据主要是 ASCII/ANSI,那么您当前的检查就足够了。在 16 位 Unicode 中,这样的字符串数据将有大部分高字节为 00 的字符。不是 100%,而是明显的大多数。这不会发生在直接的 ANSI 字符串数据中。

【讨论】:

  • 正如我在回答中所展示的,它肯定会出现在当前 ANSI 代码页中的字符上。他的全部观点是,一些字符将使用高字节,因此他的支票毫无价值。
  • @Bob77 - 不知道你在强调什么,但我没有说——事实上我很小心 not 说——所有的高字节都是零。对于普通(西方)ANSI 数据,大多数 Unicode 字符的高字节为零。但真正的一点是,对于 8 位 ANSI 字符串,几乎 none 的字节将为零。因此,对给定字符串中零字节的快速计数将为您提供其 Unicode 状态的合理指示。
  • blogs.msdn.microsoft.com/oldnewthing/20070417-00/?p=27223 这个问题基本上我们见过很多次了。
  • @Bob77 - 是的,在非常一般的情况下,计数 0 是不可靠的。但在目前的情况下,它可能会做得很好。似乎 OP 不是在寻找通用函数来测试任何随机字符串或文件,而是在寻找一种一次性(或每个 DB 一次)的方式来查看字段中的内容。在这种情况下,我会先尝试这个,但要知道错误答案的可能性很小。我在这里没有看到任何其他建议,可靠或不可靠,所以......
  • 我想如果你的雇主接受“凭猜测和天哪”编程可能没问题,但它不正确而且不可能,正如 Raymond Chen 指出的那样。相反,OP 应该返回并询问为什么数据库中有随机字符编码的数据。据他所知,可能有 Big5 DBCS 或者谁知道呢。
猜你喜欢
  • 2013-02-17
  • 1970-01-01
  • 2016-12-21
  • 2020-03-23
  • 2016-11-04
  • 2011-06-20
  • 1970-01-01
  • 1970-01-01
  • 2010-12-13
相关资源
最近更新 更多