.netframework 4.8在读取sqllite数据库的时候遇到中文乱码的情况, 且我这个数据库在navicat中中文也是乱码的,这个软件也没看到哪里有调整编码格式的地方,是否是汉化的原因?
using (var conn = new SQLiteConnection($"Data Source={dbFilePath};Version=3;Read Only=True;"))
{
conn.Open();
foreach (var tableName in DiseaseTables)
{
if (!TableExists(conn, tableName))
continue;
string mileColumn = FindMileColumn(conn, tableName);
if (string.IsNullOrEmpty(mileColumn))
continue;
string sql = $@"
SELECT
[{mileColumn}] AS Mile,
COALESCE(Length,0) AS Length,
COALESCE(Width,0) AS Width,
COALESCE(Area,0) AS Area,
COALESCE(RSurfaceType,0) AS DiseaseTypeIndex,
hex(COALESCE(DisName,'')) AS DiseaseTypeNameHex
FROM [{tableName}]
WHERE [{mileColumn}] IS NOT NULL
ORDER BY [{mileColumn}]";
using (SQLiteCommand cmd = new SQLiteCommand(sql, conn))
using (SQLiteDataReader reader = cmd.ExecuteReader())
{
while (reader.Read())
{
string disNameHex = GetString(reader, "DiseaseTypeNameHex");
string diseaseTypeName = "";
if (!string.IsNullOrEmpty(disNameHex))
{
byte[] bytes = HexStringToByteArrart(disNameHex);
diseaseTypeName = Encoding.GetEncoding("GB2312").GetString(bytes);
}
}
}
}
}
private static byte[] HexStringToByteArrart(string input)
{
input = input.Replace(" ", "").Trim().ToUpper();
byte[] buffer = new byte[input.Length / 2];
for (int i = 0; i < input.Length; i += 2)
{
buffer[i / 2] = (byte)Convert.ToByte(input.Substring(i, 2), 16);
}
return buffer;
}
就是这个diseaseTypeName之前的写法一直还是乱码 根据网上查到的说法 是c++写入的时候编码格式不对, 尝试了各种方法,最后发现如上文这样写之后可以看到正常的中文了。
参考:https://www.cnblogs.com/axiaoshuye/p/15895229.html