| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 679 人关注过本帖
标题:请教版主,一个uchar &utf8[]如何转成中文汉字
只看楼主 加入收藏
iswith
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:5
帖 子:448
专家分:582
注 册:2013-5-14
结帖率:3.33%
收藏
已结贴  问题点数:20 回复次数:13 
请教版主,一个uchar &utf8[]如何转成中文汉字
utf8[0] //186 Ascii
utf8[1] //234 Ascii

如何将其合成为一个汉字在C语言中,printf("%c%c",186 ,234);我也试了,MessageBox( StringFormat("%c%c",186 , 234));我也试了,有没有WinApi可以做到。。。?例如:CharArrayToString()这样的函数可以直接将uchar &utf8[]转成合成的汉字。。。



[此贴子已经被作者于2023-11-1 12:21编辑过]

搜索更多相关主题的帖子: 版主 汉字 转成 中文 合成 
2023-11-01 12:19
cssnet
Rank: 5Rank: 5
等 级:职业侠客
威 望:5
帖 子:351
专家分:335
注 册:2013-10-4
收藏
得分:4 
你可能对UTF-8有什么误解,去,百度一下关于UTF-8编码的具体说明。
一般来说,单个汉字,Unicode编码是2字节,UTF-8编码一般是3--6字节。

2023-11-01 14:02
yiyanxiyin
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:9
帖 子:232
专家分:1761
注 册:2023-6-29
收藏
得分:4 
    system("chcp 65001");//控制台以utf8编码显示,
    char s[] = "\xBA\xEA";//186的十六进制为ba, 234的十六进制为ea
    printf("%s",s);

    char ss[] = "\xE7\xBC\x96\xE7\xA8\x8B\xE8\xAE\xBA\xE5\x9D\x9B"; //“编程论坛”的utf8编码
    printf("%s",ss);

[此贴子已经被作者于2023-11-2 13:38编辑过]

2023-11-01 21:37
csyx
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:火星
等 级:版主
威 望:37
帖 子:708
专家分:2833
注 册:2018-3-13
收藏
得分:4 
好像跟 utf-8 没什么关系吧?
可以用这个 vfp 版的 printf,N年前好事者收集的,好在还能访问:https://

程序代码:
? printf('%c%c', 186,234)

PROCEDURE  printf (lcSource, p0, p1, p2, p3, p4, p5, p6, p7,;
    p8,p9,p10,p11,p12,p13,p14,p15)
* VFP Help: A maximum [color=#0000FF]of 27 parameters can be passed[/color]
* [color=#0000FF]from a calling program[/color]

    LOCAL lnIndex, lcDecl, lvValue, lcType, lcDecl,;
        lnResult, lcTarget

    lcDecl = ""
    FOR lnIndex=0 TO 15
        IF lnIndex <= PARAMETERS()-2
            lvValue = EVAL("p" + LTRIM(STR(lnIndex)))
            lcType = TYPE("lvValue")

            DO CASE
            CASE lcType = "C"
                lcDecl = lcDecl + ", STRING"
            CASE lcType = "N"
                lcDecl = lcDecl + ", INTEGER"
            ENDCASE
        ELSE
            lcDecl = lcDecl + ", INTEGER"
        ENDIF

    ENDFOR

    * every time this function has to be redeclared
    * according to the parameters passed to it

    lcDecl = "DECLARE INTEGER wnsprintf IN Shlwapi " +;
        "STRING @lpOut, INTEGER cchLimitIn, STRING pszFmt" +;
        lcDecl

    &lcDecl

    lcTarget = Space(4096)
    lnResult = wnsprintf (@lcTarget, Len(lcTarget), lcSource,;
        p0,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15)
RETURN  Left(lcTarget, lnResult) 



这家伙很懒,啥也没留下
2023-11-02 01:49
foxfans
Rank: 5Rank: 5
等 级:贵宾
威 望:15
帖 子:113
专家分:324
注 册:2021-10-23
收藏
得分:4 
这与utf-8编码没什么关系,你这个就是一个 c char* char[] 在vfp中全可以用string来对待, 将你的串地址sys(2600) 拷出来,其实就是 0hBAEA, 打印显示直接
?""+0hBAEA 即可。
2023-11-02 10:04
iswith
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:5
帖 子:448
专家分:582
注 册:2013-5-14
收藏
得分:0 
以下是引用foxfans在2023-11-2 10:04:29的发言:

这与utf-8编码没什么关系,你这个就是一个 c char* char[] 在vfp中全可以用string来对待, 将你的串地址sys(2600) 拷出来,其实就是 0hBAEA, 打印显示直接
?""+0hBAEA 即可。

是的!这段是与utf8没有关系的!没有问UTF8!不好意思我没有表达清楚,逻辑应该是这样的,我在一个MQL4开发平台调了ZMQ,在定义struct zmq_msg_t时我将ZMQ的MSG转到了utf-8 byte array,但我发现转换中文时我遇到的非常老火的问题,我解决不了一个中文两个数组无素合成一个中文的逻辑。。。。

[此贴子已经被作者于2023-11-2 10:42编辑过]

2023-11-02 10:40
yiyanxiyin
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:9
帖 子:232
专家分:1761
注 册:2023-6-29
收藏
得分:0 
utf8[0] //186 Ascii
utf8[1] //234 Ascii

你这个不是utf8编码, utf8编码的第一字节的最高位为0或者最高两位是11
186转二进制为10111010的最高两位是10, 这个不是第一个字节.

234(二进制为11101010)如果是第一字节, 那么后面还有2个字节,  确认一下有没有utf8[2],utf8[3]

utf8编码是具有数据验证功能的, 第一字节3个1打头表示这个字符一共有3个字节, 除了第一个字节,后面的字节都以10打头




[此贴子已经被作者于2023-11-2 11:30编辑过]

2023-11-02 11:22
iswith
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:5
帖 子:448
专家分:582
注 册:2013-5-14
收藏
得分:0 
有肯定有!其实就是string2utf8时以Ascii存放在数组上的!并不是\XXX这类型!受MQL4语言限制!我感觉它很古老跟VFP一个级别似的!
utf82string 遇到中文我就转不回来了,我以为可以两个Ascii字符合成一个中文,结果我想多了,它就合成不了。。。。。,语言就只提供这么多函数:StringToCharArray,CharArrayToString

[此贴子已经被作者于2023-11-2 12:05编辑过]

2023-11-02 12:00
sostemp
Rank: 4
等 级:贵宾
威 望:10
帖 子:202
专家分:284
注 册:2009-6-2
收藏
得分:4 
以下是引用csyx在2023-11-2 01:49:30的发言:

好像跟 utf-8 没什么关系吧?
可以用这个 vfp 版的 printf,N年前好事者收集的,好在还能访问:https://

? printf('%c%c', 186,234)

PROCEDURE  printf (lcSource, p0, p1, p2, p3, p4, p5, p6, p7,;
    p8,p9,p10,p11,p12,p13,p14,p15)
* VFP Help: A maximum of 27 parameters can be passed
* from a calling program

    LOCAL lnIndex, lcDecl, lvValue, lcType, lcDecl,;
        lnResult, lcTarget

    lcDecl = ""
    FOR lnIndex=0 TO 15
        IF lnIndex <= PARAMETERS()-2
            lvValue = EVAL("p" + LTRIM(STR(lnIndex)))
            lcType = TYPE("lvValue")

            DO CASE
            CASE lcType = "C"
                lcDecl = lcDecl + ", STRING"
            CASE lcType = "N"
                lcDecl = lcDecl + ", INTEGER"
            ENDCASE
        ELSE
            lcDecl = lcDecl + ", INTEGER"
        ENDIF

    ENDFOR

    * every time this function has to be redeclared
    * according to the parameters passed to it

    lcDecl = "DECLARE INTEGER wnsprintf IN Shlwapi " +;
        "STRING @lpOut, INTEGER cchLimitIn, STRING pszFmt" +;
        lcDecl

    &lcDecl

    lcTarget = Space(4096)
    lnResult = wnsprintf (@lcTarget, Len(lcTarget), lcSource,;
        p0,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15)
RETURN  Left(lcTarget, lnResult)

学习
2023-11-02 15:12
iswith
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:5
帖 子:448
专家分:582
注 册:2013-5-14
收藏
得分:0 
直接chr(186)+chr(234) 就可以了!两边相+等于printf('%c%c', 186,234),现在问题不是这个。。。。唉。。。。
2023-11-02 15:53
快速回复:请教版主,一个uchar &utf8[]如何转成中文汉字
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.029296 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved