谈谈c#中的字符编码转化 (sqlite 中文路径的问题)

Windows Mobile下SQLite的Native C++轻量封装实践 SQLite作为嵌入式场景中最主流的轻量级关系型数据库,以其零配置、事务安全、单文件部署等特性,广泛应用于资源受限的工业终端设备。其底层基于C语言实现,天然适配Native开发,但在Windows Mobile这类已终止支持的嵌入式平台中,需直面ARMv4T指令集兼容、wchar_t编码换、内存确定性管理及线程安全模型重构等核心挑战。本文聚焦SQLite在WM平台的本地化落地,深入解析C API直接封装、源码级编译适配、BOM敏感字符串处理、CriticalSection双重加锁等关键技术路径,为遗留系统 阅读详情
       谈到这个问题,完全是因为使用sqilte 时,不支持中文路径。准确来讲不是不支持,二是只支持以UTF8编码格式的中文路径。相信很多朋友都碰到过这个问题。

google,百度一搜,全是这样的解决方案:

        

string ikoktest = "测试";
byte[] utf8bytes = System.Text.Encoding.Default.GetBytes(ikoktest);
ikoktest = System.Text.Encoding.UTF8.GetString(utf8bytes);

你认为编码转化了吗?

答案是:的确转化了。

但为什么还是不能打开数据库或者还是不对?!

调试,看看 ikoktest 变成什么值了:"????"

真正的乱码,谁都不认识。

 再看看这段代码:

string ikoktest = "娴嬭瘯";
byte[] utf8bytes = System.Text.Encoding.Default.GetBytes(ikoktest);
ikoktest = System.Text.Encoding.UTF8.GetString(utf8bytes);

看看调试结果 ikoktest 是什么值: "测试"

明白了吗?

上面这段例子的真实用途是这样的,当一段字符本身是以UTF8编码方式编码的,但却以Default(通常是GBK或者GB2312)存储,显示,这个时候可以通过上面的这个例子校正过来。

在实际应用中,我们希望"测试"这种Default编码的转变编码为UTF8,该如何呢?

应该这样:

string ikoktest = "测试";
byte[] utf8bytes = System.Text.Encoding.Default.GetBytes(ikoktest);
byte[] utf8bytes2 = System.Text.Encoding.Convert(System.Text.Encoding.Default, System.Text.Encoding.UTF8, utf8bytes);
ikoktest = System.Text.Encoding.Default.GetString(utf8bytes2);

convert 是把一个字符数组从一个编码格式转成另外一个编码格式。

注意这里是 Default ,而不是 UTF8

ikoktest = System.Text.Encoding.Default.GetString(utf8bytes2);

这里意思是继续以默认格式保存UTF8编码的字符串,尽管你看到的是乱码:"娴嬭瘯"  但他却是UTF8格式编码的,传递给支持UTF8的库或者dll时,才能被正确的解码。


原创,未经许可,严禁转载!



sqlite3基本函数讲解以及在vs中使用为exe、静态lib、动态dll实战演练(附工程源码) 一系列函数的统一包装形式,它允许用户程序带入不同的多行SQL语句去执行不同的任务,而不必使用不同的C语言函数实现同样的效果。因为它的执行原理是sqlite3_get_table查询数据库表格,将符合条件的表格数据,包括表头按逐行逐列的顺序,将每项数据以字符串的形式一一拷贝到单独开辟的内存空间内(),然后将每个字符串的地址组成字符串数组,将这这个字符串数组的地址返还到调用者,然后sqlite3_get_table就不管了,调用者需要手动释放由sqlite3_get_table开辟的内存空间。 阅读详情

相关推荐

C#调用C++ DLL完整指南:从P/Invoke原理到生产环境避坑

在软件工程实践中,托管代码与非托管代码的互操作是连接不同技术生态的关键桥梁。其核心原理在于通过平台调用服务(P/Invoke)机制,实现.NET托管环境与原生C++运行时之间的数据封送与函数调用。这项技术的核心价值在于能够复用经过验证的高性能C++遗留代码库,或在C#应用中嵌入对计算性能、硬件驱动有极致要求的模块,从而兼顾开发效率与执行性能。典型的应用场景包括集成数学计算库、音视频处理引擎、硬件设备SDK以及游戏逻辑模块等。本文将深入解析C#与C++互操作时面临的**内存管理**挑战与**调用约定**匹配等

weixin_30940783的博客 691

C#实现获取文本文件的编码的一个类(区分GB2312和UTF8

主要介绍了C#实现获取文本文件的编码一个类,本文给出类可以自动区分GB2312和UTF8,并同时给出了使用方法,需要的朋友可以参考下

C++ Excel库选型指南:从开源到商业的全面对比

本文全面对比了C++处理Excel文件的开源与商业库,包括OpenXLSX、xlnt和LibXL等第三方库。详细分析了各库的功能特性、性能表现及适用场景,帮助开发者根据项目需求选择合适的Excel处理方案。特别适合需要高效读写Excel文件的C++开发者参考。

weixin_30352191的博客 401

C# sqlite 中文乱码的解决方法

可以解决中文乱码问题,共享给大家,解决UTF-8 换 gb2312,直接放到Bin目录中并引用

C#里面连接Sqlite数据库路径含有中文名的解决方法

通常我们把所需要的sqlite的文件路径以参数的形式传递到数据库的连接方法中,如果含有中文名就会遇到这样的问题“unable open database”,那怎么解决这样的问题呢?查了资料:sqlite只支持以utf8的字符中文路径;我们传递的参数是以string的类型传参的,string 类型其实是由各个字节流组成的,所以需要把这些字节流重新以UFT8的字符进行强制换,再重新成“string...

qq_33866143的博客 1679

C#通过编码在字符和字节之间的

    在平时开发中,时常我们需要将字符串保存到一个文件中,或者通过网络来传输;在CLR中为方便在运行时操作字符串所有都是由16位Unicode代码构成的,保存或者传输一系列16位值在效率上显得不够理想(在英文字符中半数都是有零构成的)。    通常更有效的方法是将16位值编码成一个压缩字节数组,完成后再将字节数据解码回一个16位值数组。利用这种编码技术,一个托管应用程序也能与非Unicode

Richard_jun's Blog 2135

sqlite库学习(3)为什么sqlite3_open会失败

1、现象 我们知道使用sqlite库,使用sqlite3_open打开或创建数据库文件的时,有的时候会失败或者数据库名称就是乱码,这是为什么呢? (1)在linux平台下,系统编码是utf8,很少出现问题。 (2)问题主要是windows平台下,如果数据库文件名称或路径中文,通常会出现错误。其实这是sqlite3_open函数的问题,该函数要求文件名称的参数必须是utf8. SQLITE_API int sqlite3_open( const char *filename,...

3220

sqlite中文乱码问题原因分析及解决(utf8和ascii相互换)

 自:http://www.jb51.net/article/35778.htm 通过sqlite3.dll接口对sqlite数据库进行操作,包括打开数据库,插入,查询数据库等,如果操作接口输入参数包含中文字符,会导致操作异常。例如调用sqlite3_open打开数据库文件,如果文件路径出现中文,就会导致打开失败。sqlite3_exec执行sql语句,如果包含中文对应字符就会变成乱码。

萧戈的专栏 3万+

C# 字符

谈到这个问题,完全是因为使用sqilte 时,不支持中文路径。准确来讲不是不支持,二是只支持以UTF8编码格式的中文路径。相信很多朋友都碰到过这个问题google,百度一搜,全是这样的解决方案: string ikoktest = "测试"; byte[] utf8bytes = System.Text.Encoding.Default.GetBytes(...

aao11468的博客 226

SQLite(轻量级最佳数据库) 原理分析和开发应用

概述 SQLite介绍 自几十年前出现的商业应用程序以来,数据库就成为软件应用程序的主要组成部分。正与数据库管理系统非常关键一样,它们也变得非常庞大,并占用了相当多的系统资源,增加了管理的复杂性。随着软件应用程序逐渐模块模块化,一种新型数据库会比大型复杂的传统数据库管理系统更适应。嵌入式数据库直接在应用程序进程中运行,提供了零配置(zero-configuration)运行模式,并且资源占用非...

weixin_33971130的博客 1596

python中占位符可以用什么_python占位符都有什么

python中为什么要使用占位符?python如何在一个字符串中使用两个占位符1. 使用连接符: + 12 world = "World"print "Hello " + world + " 。 " 2. 使用占位符来内插 world = "World"print "Hello %s 。" % world 3. 使用函数 li = ['my','name','is','bob']mystr = '...

weixin_39613089的博客 1510

Python 学习 ---> 模块、pypi ( 模块库 )、添加模块路径

什么是 模块 在 Python 中,一个.py文件就是一个模块(Module)。模块的名字就是文件的名字。在模块内部,通过全局变量__name__可以获取模块名(即字符串) 模块作用 为了实现代码的复用,通常会把一些其他程序中重用的代码拿出来单独放在一个程序文件中,

freeking101的博客 3439

技术博客如何成为工程师的认知校准器

技术博客本质上是工程认知的结晶过程,它将模糊直觉转化为可验证、可复用、可传播的知识资产。其核心价值不在信息分发,而在驱动作者完成三层认知解构:剥离情绪表象、抽象底层规律、建立跨场景连接。这种写作实践天然强化系统思维与问题归因能力,尤其在.NET等强类型生态中,对CLR内存模型、分布式事务边界、类型系统契约等关键概念的持续深挖,能显著提升架构决策质量。当博客内容被直接引用为生产事故根因分析依据,或嵌入IDE作为实时纠错提示时,它就从‘学习资料’升维为‘工程基础设施’——这正是老赵点滴式博客的技术价值本质。

dejz8829的专栏 356

LLPlayer:基于C/WPF架构的语言学习媒体播放器技术解析

LLPlayer采用分层架构设计,将媒体播放核心与语言学习功能解耦,形成模块化的技术栈。系统基于C#/.NET 10.0构建,WPF提供现代化的用户界面,底层媒体处理依赖Flyleaf库,AI功能则通过Whisper.net和TesseractOCR等库实现。 ### 系统架构设计 ```mermaid graph TB subgraph "表示层 Presentation Layer

gitblog_00093的博客 385

AI编程模型横评:上下文感知力决定开发效率

编程大模型不是通用问答系统,而是深度嵌入IDE的‘代码协作者’。其核心能力在于理解跨文件依赖、容忍非标代码、延续调试会话、恪守安全边界——这些统称为上下文感知力。它不依赖参数堆砌,而源于对真实项目结构、行业惯用模式和工程师思维流的建模。在Python/TypeScript工程实践中,上下文感知力直接决定补全准确率、人工修改成本与CI集成稳定性。本文基于6个真实项目Bug复现测试,聚焦Kimi K2.5、GLM-5与Minimax M2.7在跨文件引用、胶水代码生成、Legacy迁移等高频场景中的实操表现,揭

chupu2979的博客 520
上一篇: Delphi 开发中常见的问答,答案基本来自于互联网,都经过测试验证.
ikok
博客等级 码龄24年 3粉丝 8原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值