注册 登录
编程论坛 VFP论坛

请教版主,一个uchar &utf8[]如何转成中文汉字

iswith 发布于 2023-11-01 12:19, 684 次点击
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编辑过]

13 回复
#2
cssnet2023-11-01 14:02
你可能对UTF-8有什么误解,去,百度一下关于UTF-8编码的具体说明。
一般来说,单个汉字,Unicode编码是2字节,UTF-8编码一般是3--6字节。

#3
yiyanxiyin2023-11-01 21:37
    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编辑过]

#4
csyx2023-11-02 01:49
好像跟 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)


#5
foxfans2023-11-02 10:04
这与utf-8编码没什么关系,你这个就是一个 c char* char[] 在vfp中全可以用string来对待, 将你的串地址sys(2600) 拷出来,其实就是 0hBAEA, 打印显示直接
?""+0hBAEA 即可。
#6
iswith2023-11-02 10:40
以下是引用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编辑过]

#7
yiyanxiyin2023-11-02 11:22
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编辑过]

#8
iswith2023-11-02 12:00
有肯定有!其实就是string2utf8时以Ascii存放在数组上的!并不是\XXX这类型!受MQL4语言限制!我感觉它很古老跟VFP一个级别似的!
utf82string 遇到中文我就转不回来了,我以为可以两个Ascii字符合成一个中文,结果我想多了,它就合成不了。。。。。,语言就只提供这么多函数:StringToCharArray,CharArrayToString

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

#9
sostemp2023-11-02 15:12
以下是引用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)

学习
#10
iswith2023-11-02 15:53
直接chr(186)+chr(234) 就可以了!两边相+等于printf('%c%c', 186,234),现在问题不是这个。。。。唉。。。。
#11
吹水佬2023-11-03 21:22
没看明白,内码处理应该不是问题吧。
具体点说说好了,给个示例,转换前是什么数据,想转换成什么样子?
#12
iswith2023-11-05 11:45
当计算机漂洋过海来到中国后,问题来了,计算机不认识中文,当然也没法显示中文;而之前的ascii编码又没有收录汉字,而且一个字节的256种状态都被占满了,真是万恶的帝国主义啊。
无可奈何,中国必须要自己重写一张表来编码咱们的汉字,于是直接生猛地将扩展的第八位(即扩展ascii码)对应的拉丁文全部删掉,规定一个小于127的字符的意义与原来相同,但两个大于127的字符连在一起时,就表示一个汉字,前面的一个字节(称为高字节)从0xA1用到0xF7,后面一个字节(低字节)从0xA1到0xFE,这样我们就可以组合出大约7000多个简体汉字了;这种汉字方案叫做 “GB2312”。现在我卡在组合,在c++,c,甚至VFP都是可以组合这样的汉字,问题我在MQL4它不支持组合,无法组合两个字符组合在一起,它任然是两个字符,看看是否有其它转中文思路。。。。
#13
吹水佬2023-11-05 13:06
回复 12楼 iswith
这样说应该不是编码的事,是使用编码的问题。
应用程序不支持这种编码,只能在应用程序着手。
#14
sostemp2023-12-19 09:18
学习

1