8133|20

64

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

sqlite 中文路径支持问题 [复制链接]

各位大虾好,我现在用sqlite 数据库,可是我发现它不支持中文路径,但是我想把数据放到存储卡上,请问该怎么解决呢,我查到可能是字符集的问题,请问该怎么转换呢,望指点

最新回复

我是这样改的噢。。完全可。。你试试。。。 static void Gb2312_2_Unicode(unsigned short* dst, const char * src) {         MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, src, 2, (LPWSTR)dst, 1); } static void Unicode_2_UTF8(char* dst, unsigned short* src) {         char* pchar = (char *)src;                 dst[0] = (0xE0 | ((pchar[1] & 0xF0) >> 4));         dst[1] = (0x80 | ((pchar[1] & 0x0F) > 6);         dst[2] = (0x80 | ( pchar[0] & 0x3F)); } int GB2312_2_UTF8(char * buf, int buf_len, const char * src, int src_len) {         int j = 0;         int i;         if (0 == src_len)                 src_len = strlen(src);         for ( i = 0; i < src_len; )         {                 if (j >= buf_len - 1)                 {                         break;                 }                 if (src[i] >= 0)                 {                         buf[j++] = src[i++];                 }                 else                 {                         unsigned short w_c = 0;                         char tmp[4] = "";                         Gb2312_2_Unicode(&w_c, src + i);                         Unicode_2_UTF8(tmp, &w_c);                                                 buf[j+0] = tmp[0];                         buf[j+1] = tmp[1];                         buf[j+2] = tmp[2];                                                 i += 2;                         j += 3;                 }         }         buf[j] = '\0';         return j; } 复制代码  详情 回复 发表于 2009-4-2 11:42
点赞 关注

回复
举报

80

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
http://www.cnblogs.com/qiubole/archive/2007/11/21/951807.html

楼主先搜索了没有?

按帖子的说明,你只要转换成utf-8格式就行了。

multipbytetowidechar(CP_UTF8,
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
咦。。。。貌似发了两次贴吧,有钱人。
SQLITE中是用UTF8编码进行文件打开操作的。

只要转换成utf-8格式就行了。
 
 
 

回复

53

帖子

0

TA的资源

一粒金砂(初级)

4
 
现在关键问题是转换不对,转完了是乱码的
 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

5
 
没有你的转换代码。不清楚什么具体细节。

 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

6
 
引用 3 楼 jiahan1314 的回复:
现在关键问题是转换不对,转完了是乱码的

中文转成UTF-8不对?代码。
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

7
 
__inline void Gb2312_2_Unicode(unsigned short* dst, const char * src)
{
//本来这句话是调不通的,我把第五个参数dst 加了个强制类型转换(LPWSTR),就调通了,转完是乱码的,我自己试了好几种方法,但都没有成功,这个方法是我从网上下的,觉得应该完整一点,可是还是没有成功,但是我似乎看到有人使用成功过,望各位高手指点
        ::MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, src, 2, (LPWSTR)dst, 1);
}

__inline void Unicode_2_UTF8(char* dst, unsigned short* src)
{
        char* pchar = (char *)src;
        dst[0] = (0xE0 | ((pchar[1] & 0xF0) >> 4));
        dst[1] = (0x80 | ((pchar[1] & 0x0F) << 2)) + ((pchar[0] & 0xC0) >> 6);
        dst[2] = (0x80 | ( pchar[0] & 0x3F));
}
int CCodingConv::GB2312_2_UTF8(char * buf, int buf_len, const char * src, int src_len)
{
        if (0 == src_len)
                src_len = strlen(src);

        int j = 0;
        for (int i = 0; i < src_len;)
        {
                if (j >= buf_len - 1)
                        break;

                if (src >= 0)
                {
                        buf[j++] = src[i++];
                }
                else
                {
                        unsigned short w_c = 0;
                        Gb2312_2_Unicode(&w_c, src + i);

                        char tmp[4] = "";
                        Unicode_2_UTF8(tmp, &w_c);
                       
                        buf[j+0] = tmp[0];
                        buf[j+1] = tmp[1];
                        buf[j+2] = tmp[2];
                       
                        i += 2;
                        j += 3;
                }
        }

        buf[j] = '\0';

        return j;
}
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

8
 
__inline void Gb2312_2_Unicode(unsigned short* dst, const char * src)
{
//本来这句话是调不通的,我把第五个参数dst 加了个强制类型转换(LPWSTR),就调通了,转完是乱码的,我自己试了好几种方法,但都没有成功,这个方法是我从网上下的,觉得应该完整一点,可是还是没有成功,但是我似乎看到有人使用成功过,望各位高手指点
::MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, src, 2, (LPWSTR)dst, 1);
}

__inline void Unicode_2_UTF8(char* dst, unsigned short* src)
{
char* pchar = (char *)src;
dst[0] = (0xE0 ? ((pchar[1] & 0xF0) >> 4));
dst[1] = (0x80 ? ((pchar[1] & 0x0F) < < 2)) + ((pchar[0] & 0xC0) >> 6);
dst[2] = (0x80 ? ( pchar[0] & 0x3F));
}
int CCodingConv::GB2312_2_UTF8(char * buf, int buf_len, const char * src, int src_len)
{
     if (0 == src_len)
         src_len = strlen(src);

    int j = 0;
    for (int i = 0; i < src_len;)
    {
        if (j >= buf_len - 1)
            break;

        if (src >= 0)
        {
            buf[j++] = src[i++];
        }
        else
        {
            unsigned short w_c = 0;
            Gb2312_2_Unicode(&w_c, src + i);

            char tmp[4] = "";
            Unicode_2_UTF8(tmp, &w_c);

            buf[j+0] = tmp[0];
            buf[j+1] = tmp[1];
            buf[j+2] = tmp[2];

            i += 2;
            j += 3;
        }
    }

    buf[j] = '\0';

    return j;
}
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

9
 
不明白你是哪里拷来的,反正跟你不一样
__inline void Gb2312_2_Unicode(unsigned short* dst, const char * src)
{
        ::MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, src, 2, dst, 1);
}

__inline void Unicode_2_UTF8(char* dst, unsigned short* src)
{
        char* pchar = (char *)src;
       
        dst[0] = (0xE0 | ((pchar[1] & 0xF0) >> 4));
        dst[1] = (0x80 | ((pchar[1] & 0x0F) << 2)) + ((pchar[0] & 0xC0) >> 6);
        dst[2] = (0x80 | ( pchar[0] & 0x3F));
}

__inline void UTF8_2_Unicode(unsigned short* dst, const char * src)
{
        char* uchar = (char *)dst;
       
        uchar[1] = ((src[0] & 0x0F) << 4) + ((src[1] >> 2) & 0x0F);
        uchar[0] = ((src[1] & 0x03) << 6) + (src[2] & 0x3F);
}

__inline void Unicode_2_GB2312(char* dst, unsigned short uData)
{
        WideCharToMultiByte(CP_ACP, NULL, &uData, 1, dst, sizeof(unsigned short), NULL, NULL);
}

int CCodingConv::GB2312_2_UTF8(char * buf, int buf_len, const char * src, int src_len)
{
        if (0 == src_len)
                src_len = strlen(src);

        int j = 0;
        for (int i = 0; i < src_len;)
        {
                if (j >= buf_len - 1)
                        break;

                if (src >= 0)
                {
                        buf[j++] = src[i++];
                }
                else
                {
                        unsigned short w_c = 0;
                        Gb2312_2_Unicode(&w_c, src + i);

                        char tmp[4] = "";
                        Unicode_2_UTF8(tmp, &w_c);
                       
                        buf[j+0] = tmp[0];
                        buf[j+1] = tmp[1];
                        buf[j+2] = tmp[2];
                       
                        i += 2;
                        j += 3;
                }
        }

        buf[j] = '\0';

        return j;
}

int CCodingConv::UTF8_2_GB2312(char * buf, int buf_len, const char * src, int src_len)
{
        if (0 == src_len)
                src_len = strlen(src);
       
        int j = 0;
        for (int i = 0; i < src_len;)
        {
                if (j >= buf_len - 1)
                        break;

                if (src >= 0)
                {
                        buf[j++] = src[i++];
                }
                else
                {
                        unsigned short w_c = 0;
                        UTF8_2_Unicode(&w_c, src + i);
                       
                        char tmp[4] = "";
                        Unicode_2_GB2312(tmp, w_c);
                       
                        buf[j+0] = tmp[0];
                        buf[j+1] = tmp[1];
                       
                        i += 3;
                        j += 2;
                }
        }
       
        buf[j] = '\0';
       
        return j;
}
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

10
 
  1. __inline void Gb2312_2_Unicode(unsigned short* dst, const char * src)
  2. {
  3.         ::MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, src, 2, dst, 1);
  4. }

  5. __inline void Unicode_2_UTF8(char* dst, unsigned short* src)
  6. {
  7.         char* pchar = (char *)src;
  8.        
  9.         dst[0] = (0xE0 | ((pchar[1] & 0xF0) >> 4));
  10.         dst[1] = (0x80 | ((pchar[1] & 0x0F) << 2)) + ((pchar[0] & 0xC0) >> 6);
  11.         dst[2] = (0x80 | ( pchar[0] & 0x3F));
  12. }

  13. __inline void UTF8_2_Unicode(unsigned short* dst, const char * src)
  14. {
  15.         char* uchar = (char *)dst;
  16.        
  17.         uchar[1] = ((src[0] & 0x0F) << 4) + ((src[1] >> 2) & 0x0F);
  18.         uchar[0] = ((src[1] & 0x03) << 6) + (src[2] & 0x3F);
  19. }

  20. __inline void Unicode_2_GB2312(char* dst, unsigned short uData)
  21. {
  22.         WideCharToMultiByte(CP_ACP, NULL, &uData, 1, dst, sizeof(unsigned short), NULL, NULL);
  23. }

  24. int CCodingConv::GB2312_2_UTF8(char * buf, int buf_len, const char * src, int src_len)
  25. {
  26.         if (0 == src_len)
  27.                 src_len = strlen(src);

  28.         int j = 0;
  29.         for (int i = 0; i < src_len;)
  30.         {
  31.                 if (j >= buf_len - 1)
  32.                         break;

  33.                 if (src[i] >= 0)
  34.                 {
  35.                         buf[j++] = src[i++];
  36.                 }
  37.                 else
  38.                 {
  39.                         unsigned short w_c = 0;
  40.                         Gb2312_2_Unicode(&w_c, src + i);

  41.                         char tmp[4] = "";
  42.                         Unicode_2_UTF8(tmp, &w_c);
  43.                        
  44.                         buf[j+0] = tmp[0];
  45.                         buf[j+1] = tmp[1];
  46.                         buf[j+2] = tmp[2];
  47.                        
  48.                         i += 2;
  49.                         j += 3;
  50.                 }
  51.         }

  52.         buf[j] = '\0';

  53.         return j;
  54. }

  55. int CCodingConv::UTF8_2_GB2312(char * buf, int buf_len, const char * src, int src_len)
  56. {
  57.         if (0 == src_len)
  58.                 src_len = strlen(src);
  59.        
  60.         int j = 0;
  61.         for (int i = 0; i < src_len;)
  62.         {
  63.                 if (j >= buf_len - 1)
  64.                         break;

  65.                 if (src[i] >= 0)
  66.                 {
  67.                         buf[j++] = src[i++];
  68.                 }
  69.                 else
  70.                 {
  71.                         unsigned short w_c = 0;
  72.                         UTF8_2_Unicode(&w_c, src + i);
  73.                        
  74.                         char tmp[4] = "";
  75.                         Unicode_2_GB2312(tmp, w_c);
  76.                        
  77.                         buf[j+0] = tmp[0];
  78.                         buf[j+1] = tmp[1];
  79.                        
  80.                         i += 3;
  81.                         j += 2;
  82.                 }
  83.         }
  84.        
  85.         buf[j] = '\0';
  86.        
  87.         return j;
  88. }
复制代码
 
 
 

回复

59

帖子

0

TA的资源

一粒金砂(初级)

11
 
例如
char *srcPath = "HardDisk1\\我的数据库.db"; //注意是char类型 如果是CString 先利用WideCharToMultiByte转换成char类型. 断点查看srcPath 是正常的.

char *uf8Path = new char[256];

CCodingConv::GB2312_2_UTF8(uf8Path , 256, srcPath , 0);//断点查看uf8path 显示乱码
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

12
 
一样吧,只不过我把我没有用到的没有贴上来,KevinCEC,昨天我看到你的帖子说用个函数转换一下就行了,您用的就是这个吗,是用GB2312_2_UTF8吗?我直接把代码加到工程里怎么调试通不过啊,提示不能把
::MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, src, 2, dst, 1);这句中的第五个参数由unsigned short *转换为LPWSTR
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

13
 
src必须是char*
dst必须是WCHAR*
 
 
 

回复

92

帖子

0

TA的资源

一粒金砂(初级)

14
 
我单步跟踪发现GB2312_2_UTF8函数里src取到的汉字是乱码的,请问char*数组里面的汉字不是直接用它的下标取吗,怎么会是乱码呢?
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

15
 
汉字占两个字节。也就是说一个汉字要用两个char
 
 
 

回复

59

帖子

0

TA的资源

一粒金砂(初级)

16
 
我们这样做好好的。

可能跟系统裁的有关系,上次我自己裁了一个就不行。研究了半天也不知道为什么,我也选择系统的字符为GB2312

然后我们供应商裁的系统就好的,我还叫他一步一步教我,结果也不行。
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

17
 
我用的是多普达e806c,不知道系统的字符是怎么样的,这个可以在哪里看吗
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

18
 
1.“可是我发现它不支持中文路径,想把数据放到存储卡上”  说明你的环境已经是中文的了, 已经包含了 中文的Codepage  汉字转换码表了 ,除非 他的系统是自己实现的Codepage 转换,没有用到Mobile的 系统码表转换功能

2、HardDisk1\\我的数据库.db   好像是相对路径。。。。。

3、 使用这个的时候

::MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, src, 2, (LPWSTR)dst, 1);

一般是根据当前系统的 CP_ACP   来取Codepage 的, 如果这个 取得不对,你当然转换不对了。 首先查看你系统的Codepage是什么。

系统注册表中的 [HKEY_CURRENT_USER\MUI]  
To set the default locale for the system, you set the following registry value to a hexadecimal value that represents the default locale to use for the system.

[HKEY_LOCAL_MACHINE\nls]
  "DefaultLCID": REG_DWORD
If this is not set, then the default is locale 0x409.
To override a locale's default original equipment manufacturer (OEM) code page, you must set the following registry value to a hexadecimal value that represents the default OEM code page to use instead of the one defined by the current locale.
[HKEY_LOCAL_MACHINE\nls]
  "DefaultOCP": REG_DWORD
If an invalid or unsupported OEM code page is supplied, then the default code of 437 is used for the system.

To override a locale's default ASCII code page, you must set the following registry value to a hexadecimal value that represents the default ASCII code page to use instead of the one defined by the current locale.

[HKEY_LOCAL_MACHINE\nls]
  "DefaultACP": REG_DWORD
If an invalid or unsupported OEM code page is supplied, then the default code of 1252 is used for the system.

For an example of these registry values, see Common.reg in Microsoft? Platform Builder.

这是WinCE5.0 Help下面的  请参考

 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

19
 
1、您是说我的开发环境吗?如果是说开发环境的话,我的环境确实是VS2005中文的
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

20
 
我的问题解决了,现在可以放到中文路径下面了,我用的CDBSqlite类里有一个是UTF8的函数,这个只要给它传递LPCSTR类型的参数就行了,使用中文路径是没有问题的,以前我用的是UTF16的那个函数 ,不知道大家用的sqlite是否跟我的一样,谢谢各位大侠的帮忙!我的邮箱hanhan_jia@126.com
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表