| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
共有 342 人关注过本帖
标题:需要VFP9中显示国际音标如ŋ,但VFP9中读取包含Unicode字符的内容就乱码 ...
只看楼主 加入收藏
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10644
专家分:43272
注 册:2014-5-20
收藏
得分:0 
保存和读取好像也没问题
STRTOFILE(0hC58B,"tmp.txt")        && 保存后用记事本打开 ŋ
?STRCONV(FILETOSTR("tmp.txt"),15)  && 读取显示编码正常

昨晚 22:23
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10644
专家分:43272
注 册:2014-5-20
收藏
得分:0 
不要用vfp字符串来处理输入输出。
可以用内存编码再通过内存地址传送。
或者用转义字符码,如用web控件时html的&#x....,ŋ的码是014b(两字节)。
昨晚 22:43
shschy
Rank: 2
等 级:论坛游民
帖 子:112
专家分:45
注 册:2022-3-13
收藏
得分:0 
请教用内存编码再通过内存地址传送,有具体的可执行代码吗?以下是搜到的,但调试不成功。
以下代码执行下来无效果。
    * 读取剪贴板Unicode文本(修复内存复制问题)
    LOCAL hClip, pData, nSize, cBuffer, cUnicode
    cUnicode = ""
   
    DECLARE INTEGER OpenClipboard IN user32 INTEGER hWnd
    DECLARE INTEGER CloseClipboard IN user32
    DECLARE INTEGER GetClipboardData IN user32 INTEGER uFormat
    DECLARE INTEGER GlobalLock IN kernel32 INTEGER hMem
    DECLARE INTEGER GlobalUnlock IN kernel32 INTEGER hMem
    DECLARE INTEGER GlobalSize IN kernel32 INTEGER hMem
    DECLARE INTEGER RtlMoveMemory IN kernel32;
        STRING @lpvDest, INTEGER lpvSource, INTEGER cbCopy
   
    IF OpenClipboard(0) = 0
        MESSAGEBOX("剪贴板被占用,请关闭占用程序后重试", 16)
        RETURN ""
    ENDIF
   
    * 读取CF_UNICODETEXT格式(13)
    hClip = GetClipboardData(13)
    IF hClip > 0
        pData = GlobalLock(hClip)
        IF pData > 0
            nSize = GlobalSize(hClip)
            IF nSize > 0 AND nSize % 2 = 0  && 确保UTF-16格式(偶数字节)
                cBuffer = REPLICATE(CHR(0), nSize)
                RtlMoveMemory(@cBuffer, pData, nSize)  && 稳定复制内存
                cUnicode = STRTRAN(cBuffer, CHR(0)+CHR(0), "", 1, 1)  && 移除结尾空字符
            ENDIF
            GlobalUnlock(hClip)
        ENDIF
    ENDIF
    CloseClipboard()
    &&RETURN cUnicode
    &&cUnicode
   
        * 将UTF-16字符串转为UTF-8(用于文件输出)
    LOCAL nLen, nBufSize, cUTF8, nResult
    nLen = LEN(cUnicode)
    IF nLen = 0
       RETURN ""
    ENDIF
   
    DECLARE INTEGER WideCharToMultiByte IN kernel32;
        INTEGER CodePage, INTEGER dwFlags,;
        STRING cWideCharStr, INTEGER cchWideChar,;
        STRING @cMultiByteStr, INTEGER cchMultiByte,;
        STRING cDefaultChar, INTEGER @lpUsedDefaultChar
   
    * 获取所需缓冲区大小
    nBufSize = WideCharToMultiByte(65001, 0, cUnicode, nLen/2, "", 0, "", 0)
    IF nBufSize = 0
       RETURN ""
    ENDIF
   
    * 转换为UTF-8
    cUTF8 = REPLICATE(CHR(0), nBufSize)
    nResult = WideCharToMultiByte(65001, 0, cUnicode, nLen/2, @cUTF8, nBufSize, "", 0)
   
    thisform.olecontrol4.font.Name = "微软雅黑"
    thisform.olecontrol1.text=nResult
    thisform.olecontrol2.text=nLen
    thisform.olecontrol3.text=nBufSize
    thisform.olecontrol4.text=FILETOSTR("test.txt") &&cUTF8
以下是引用吹水佬在2025-8-18 22:43:38的发言:

不要用vfp字符串来处理输入输出。
可以用内存编码再通过内存地址传送。
或者用转义字符码,如用web控件时html的&#x....,ŋ的码是014b(两字节)。

1 小时前
shschy
Rank: 2
等 级:论坛游民
帖 子:112
专家分:45
注 册:2022-3-13
收藏
得分:0 
请问应该用何种语言描述,去求索得到完全音标的对应关系表信息(比如C58b 对应 ŋ)?
参考以上代码 使用 STRTOFILE(0h0073+0h0069+0hC58B,"oldtmp.txt") 实现“ s iŋ”存入oldtmp.txt
请问应该用何种语言描述,去求索得到完全音标的对应关系表信息(比如C58b  对应 ŋ)?
请问可以通过内存调用,实现将上述oldtmp.txt内容直接经过内存,到microsoft form textbox中显示?
还是只能编个html文件,到浏览器中显示?谢谢!

以下是引用吹水佬在2025-8-18 22:23:37的发言:

保存和读取好像也没问题
STRTOFILE(0hC58B,"tmp.txt")        && 保存后用记事本打开 ŋ
?STRCONV(FILETOSTR("tmp.txt"),15)  && 读取显示编码正常

1 小时前
shschy
Rank: 2
等 级:论坛游民
帖 子:112
专家分:45
注 册:2022-3-13
收藏
得分:0 
上网按照“请按表格方式提供每个国际音标对应的编码”搜到如下信息,
但 为   014B,好像与前次搜到的 “"ŋ":U+014B → UTF-8编码为0xC5 0x8B(双字节序列)”不一致
图片附件: 游客没有浏览图片的权限,请 登录注册



35 分钟前
shschy
Rank: 2
等 级:论坛游民
帖 子:112
专家分:45
注 册:2022-3-13
收藏
得分:0 
图片附件: 游客没有浏览图片的权限,请 登录注册
33 分钟前
快速回复:需要VFP9中显示国际音标如ŋ,但VFP9中读取包含Unicode字符的内容 ...
数据加载中...
 
   



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

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018052 second(s), 11 queries.
Copyright©2004-2025, BC-CN.NET, All Rights Reserved