高分请教:sprintf函数 与 字符集的问题,详见帖子

scsnsjsl_cs_dn 2013-05-15 02:22:55
有如下语句:
const char *pNameUtf8 = CStaticData::Instance()->GetWord(1);
const char *pName = "NI你";

char sql[1024] = {0}, sqlUtf8[1024] = {0};
sprintf_s(sql, sizeof(sql), "select 1 from table_test where name = \'%s\'", pName);
sprintf_s(sqlUtf8, sizeof(sqlUtf8), "select 1 from table_test where name = \'%s\'", pNameUtf8);


环境vs2010,

pNameUtf8 是根据函数GetWord返回的utf8字符集,
pName 是在代码的常量指针,
二者的字面意思都是"NI你"

sql的结果是:select 1 from table_test where name = 'NI浣?
sqlUtf8结果:select 1 from table_test where name = 'NI你'

为什么sql的结束符前的字符'不见了?

请不吝赐教,谢谢
...全文
127 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 16 楼 scsnsjsl_cs_dn 的回复:
[quote=引用 15 楼 akirya 的回复:] [quote=引用 13 楼 scsnsjsl_cs_dn 的回复:] [quote=引用 12 楼 akirya 的回复:] [quote=引用 5 楼 scsnsjsl_cs_dn 的回复:] 提示错误:[Microsoft][ODBC SQL Server Driver][SQL Server]字符串 'NI浣?' 后的引号不完整。
看报错应该先将utf-8转化为ansi。[/quote] 转换后确实可行 现在没想明白的是,为什么执行sprintf_s函数后,最后一个字符'不见了[/quote] 显示的时候,如果第一个字节的最高位是1的话,那么就2个字符显示出一个汉字。 0xE4, 0xBD 显示的是 浣 0xA0最高位是1,那么就跟后面的'合并成1个汉字符了。 0xA0,0x27 没这个字符 于是就给了?号了。[/quote] 那执行该sql语句的时候,提示错误:提示错误:[Microsoft][ODBC SQL Server Driver][SQL Server]字符串 'NI浣?' 后的引号不完整。 难道是sql本身本身的问题?[/quote] 是sql支持字符集的问题啊,要是sql只支持utf-8编码的话 select 1 from table_test where name = 'NI浣? 这样就能正常识别。
scsnsjsl_cs_dn 2013-05-16
  • 打赏
  • 举报
回复
引用 15 楼 akirya 的回复:
[quote=引用 13 楼 scsnsjsl_cs_dn 的回复:] [quote=引用 12 楼 akirya 的回复:] [quote=引用 5 楼 scsnsjsl_cs_dn 的回复:] 提示错误:[Microsoft][ODBC SQL Server Driver][SQL Server]字符串 'NI浣?' 后的引号不完整。
看报错应该先将utf-8转化为ansi。[/quote] 转换后确实可行 现在没想明白的是,为什么执行sprintf_s函数后,最后一个字符'不见了[/quote] 显示的时候,如果第一个字节的最高位是1的话,那么就2个字符显示出一个汉字。 0xE4, 0xBD 显示的是 浣 0xA0最高位是1,那么就跟后面的'合并成1个汉字符了。 0xA0,0x27 没这个字符 于是就给了?号了。[/quote] 那执行该sql语句的时候,提示错误:提示错误:[Microsoft][ODBC SQL Server Driver][SQL Server]字符串 'NI浣?' 后的引号不完整。 难道是sql本身本身的问题
scsnsjsl_cs_dn 2013-05-16
  • 打赏
  • 举报
回复
引用 17 楼 akirya 的回复:
[quote=引用 16 楼 scsnsjsl_cs_dn 的回复:] [quote=引用 15 楼 akirya 的回复:] [quote=引用 13 楼 scsnsjsl_cs_dn 的回复:] [quote=引用 12 楼 akirya 的回复:] [quote=引用 5 楼 scsnsjsl_cs_dn 的回复:] 提示错误:[Microsoft][ODBC SQL Server Driver][SQL Server]字符串 'NI浣?' 后的引号不完整。
看报错应该先将utf-8转化为ansi。[/quote] 转换后确实可行 现在没想明白的是,为什么执行sprintf_s函数后,最后一个字符'不见了[/quote] 显示的时候,如果第一个字节的最高位是1的话,那么就2个字符显示出一个汉字。 0xE4, 0xBD 显示的是 浣 0xA0最高位是1,那么就跟后面的'合并成1个汉字符了。 0xA0,0x27 没这个字符 于是就给了?号了。[/quote] 那执行该sql语句的时候,提示错误:提示错误:[Microsoft][ODBC SQL Server Driver][SQL Server]字符串 'NI浣?' 后的引号不完整。 难道是sql本身本身的问题?[/quote] 是sql支持字符集的问题啊,要是sql只支持utf-8编码的话 select 1 from table_test where name = 'NI浣? 这样就能正常识别。 [/quote] 明白了,谢谢
shen_wei 2013-05-16
  • 打赏
  • 举报
回复
字符集最好换成一种来使用。。
  • 打赏
  • 举报
回复
引用 13 楼 scsnsjsl_cs_dn 的回复:
[quote=引用 12 楼 akirya 的回复:] [quote=引用 5 楼 scsnsjsl_cs_dn 的回复:] 提示错误:[Microsoft][ODBC SQL Server Driver][SQL Server]字符串 'NI浣?' 后的引号不完整。
看报错应该先将utf-8转化为ansi。[/quote] 转换后确实可行 现在没想明白的是,为什么执行sprintf_s函数后,最后一个字符'不见了[/quote] 显示的时候,如果第一个字节的最高位是1的话,那么就2个字符显示出一个汉字。 0xE4, 0xBD 显示的是 浣 0xA0最高位是1,那么就跟后面的'合并成1个汉字符了。 0xA0,0x27 没这个字符 于是就给了?号了。
scsnsjsl_cs_dn 2013-05-15
  • 打赏
  • 举报
回复
引用 11 楼 sadasasdasd 的回复:
你换一个SQL拼写,你不要有这一种。name = '"+ pName+"';换一下这一种行不行。
试过不行的
scsnsjsl_cs_dn 2013-05-15
  • 打赏
  • 举报
回复
引用 12 楼 akirya 的回复:
[quote=引用 5 楼 scsnsjsl_cs_dn 的回复:] 提示错误:[Microsoft][ODBC SQL Server Driver][SQL Server]字符串 'NI浣?' 后的引号不完整。
看报错应该先将utf-8转化为ansi。[/quote] 转换后确实可行 现在没想明白的是,为什么执行sprintf_s函数后,最后一个字符'不见了
  • 打赏
  • 举报
回复
引用 5 楼 scsnsjsl_cs_dn 的回复:
提示错误:[Microsoft][ODBC SQL Server Driver][SQL Server]字符串 'NI浣?' 后的引号不完整。
看报错应该先将utf-8转化为ansi。
  • 打赏
  • 举报
回复
你换一个SQL拼写,你不要有这一种。name = '"+ pName+"';换一下这一种行不行。
scsnsjsl_cs_dn 2013-05-15
  • 打赏
  • 举报
回复
还有vs2010中使用的是什么字符集,比如中文注释?
scsnsjsl_cs_dn 2013-05-15
  • 打赏
  • 举报
回复
引用 7 楼 zgl7903 的回复:
UTF8 ANSI 相互转换的函数 .
除了把utf转化成ansi还有其他方法没?
西山小月 2013-05-15
  • 打赏
  • 举报
回复
2010里面得使用unicode
zgl7903 2013-05-15
  • 打赏
  • 举报
回复
scsnsjsl_cs_dn 2013-05-15
  • 打赏
  • 举报
回复
引用 3 楼 akirya 的回复:
utf-8编码的 你 对应的是 0xE4, 0xBD, 0xA0 显示的时候,如果第一个字节的最高位是1的话,那么就2个字符显示出一个文字。 0xE4, 0xBD 显示的是 浣 0xA0,0x27 没这个字符 于是就给了?号了。 pNameUtf8 得到的也是ansi编码的,你是2字节,所以也能正常显示。
那我这个应该怎么处理呢?
scsnsjsl_cs_dn 2013-05-15
  • 打赏
  • 举报
回复
提示错误:[Microsoft][ODBC SQL Server Driver][SQL Server]字符串 'NI浣?' 后的引号不完整。
scsnsjsl_cs_dn 2013-05-15
  • 打赏
  • 举报
回复
引用 3 楼 akirya 的回复:
utf-8编码的 你 对应的是 0xE4, 0xBD, 0xA0 显示的时候,如果第一个字节的最高位是1的话,那么就2个字符显示出一个文字。 0xE4, 0xBD 显示的是 浣 0xA0,0x27 没这个字符 于是就给了?号了。 pNameUtf8 得到的也是ansi编码的,你是2字节,所以也能正常显示。
我用vs的快速监视,得到的是上边的语句,但是从数组来看的话,在结束符前的单引号是有的, 但是这样执行sql的时候,提示sql语句出错
  • 打赏
  • 举报
回复
utf-8编码的 你 对应的是 0xE4, 0xBD, 0xA0 显示的时候,如果第一个字节的最高位是1的话,那么就2个字符显示出一个文字。 0xE4, 0xBD 显示的是 浣 0xA0,0x27 没这个字符 于是就给了?号了。 pNameUtf8 得到的也是ansi编码的,你是2字节,所以也能正常显示。
scsnsjsl_cs_dn 2013-05-15
  • 打赏
  • 举报
回复
引用 1 楼 oyljerry 的回复:
用unicode字符串.或者全部转换成UTF8再显示
你是说把项目改成使用unicode字符集? 这样试过,不行的
oyljerry 2013-05-15
  • 打赏
  • 举报
回复
用unicode字符串.或者全部转换成UTF8再显示

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧