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

2025-08-18 22:23
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10714
专家分:43295
注 册:2014-5-20
收藏
得分:0 
不要用vfp字符串来处理输入输出。
可以用内存编码再通过内存地址传送。
或者用转义字符码,如用web控件时html的&#x....,ŋ的码是014b(两字节)。
2025-08-18 22:43
shschy
Rank: 2
等 级:论坛游民
帖 子:134
专家分: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(两字节)。

2025-08-19 17:13
shschy
Rank: 2
等 级:论坛游民
帖 子:134
专家分: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)  && 读取显示编码正常

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



2025-08-19 18:28
shschy
Rank: 2
等 级:论坛游民
帖 子:134
专家分:45
注 册:2022-3-13
收藏
得分:0 
图片附件: 游客没有浏览图片的权限,请 登录注册
2025-08-19 18:29
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10714
专家分:43295
注 册:2014-5-20
收藏(1)
得分:0 
Windows带W的API和控件(EDITW)是支持Unicode,通常用STRCONV(UTF-8,12)就可以,但好像不支持这个C58B的UTF-8字符,不知是否与代码页有关。
用WEB控件试试
图片附件: 游客没有浏览图片的权限,请 登录注册

图片附件: 游客没有浏览图片的权限,请 登录注册


[此贴子已经被作者于2025-8-19 23:39编辑过]

2025-08-19 23:36
sych
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:7
帖 子:425
专家分:648
注 册:2019-10-11
收藏
得分:2 
这样修改即可
SYS(3101,65001)
thisform.Olecontrol1.text=STRCONV(filetostr("d:\unicode.text"),10)
SYS(3101,0)
2025-08-20 08:37
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10714
专家分:43295
注 册:2014-5-20
收藏
得分:0 
测试了一下,用windows api也可以用EDIT控件
有兴趣可以参考测试代码
图片附件: 游客没有浏览图片的权限,请 登录注册

程序代码:
CLEAR
CLEAR ALL

PUBLIC cDefPath
cDefPath = ADDBS(JUSTPATH(SYS(16)))
SET DEFAULT TO (cDefPath)

DECLARE Long SetFocus     IN user32 long
DECLARE Long CreateUEdit  IN UEdit long
DECLARE Long DestroyUEdit IN UEdit long
DECLARE Long SetUEditText IN UEdit long,string
DECLARE Long SetFont      IN UEdit long,long,string

of = CREATEOBJECT("formUEdit")
of.show()
READ EVENTS

 
CLOSE TABLES ALL 
CLEAR ALL
RETURN

DEFINE CLASS formUEdit as Form 
    ShowWindow = 2
    hUEdit     = 0
    PROCEDURE Activate
        this.hUEdit = CreateUEdit(this.hWnd) 
        SetFont(this.hUEdit, 24, "Arial")
        SetFocus(this.hUEdit)
        SetUEditText(this.hUEdit, STRCONV(0h7369C58B00,12))
    ENDPROC
    PROCEDURE Destroy
        DestroyUEdit(this.hUEdit)
        CLEAR EVENTS 
    ENDPROC 
ENDDEFINE


为测试方便用C写UEdit.dll给vfp调用
程序代码:
#define DLLIMPORT __declspec(dllexport)

#include <windows.h>

HINSTANCE hInstance = NULL;

DLLIMPORT void SetUEditText(HWND hWndUEdit, LPCWSTR pWSTR)
{
    SetWindowTextW(hWndUEdit, pWSTR);
}

DLLIMPORT void SetFont(HWND hWndUEdit, int cHeight, LPCSTR pFontName)
{
    HFONT hFont = CreateFont(cHeight, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, DEFAULT_CHARSET,
                              OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
                              DEFAULT_PITCH, pFontName);
    SendMessage(hWndUEdit, WM_SETFONT, (WPARAM)hFont, TRUE);
}

DLLIMPORT void DestroyUEdit(HWND hWndUEdit)
{
    DestroyWindow(hWndUEdit);
}

DLLIMPORT HWND CreateUEdit(HWND hWndParent)
{
    return CreateWindowExW(
        0,                                                  // 无扩展样式
        L"EDIT",                                            // 预定义EDIT类名
        L"",                                                // 初始文本为空
        WS_CHILD | WS_VISIBLE | WS_BORDER | ES_MULTILINE,   // 样式
        10, 10, 100, 100,                                    // 位置和尺寸
        hWndParent,                                         // 父窗口句柄
        0,                                                  // 控件ID
        hInstance,                                          // 程序实例句柄
        NULL                                                // 无附加参数
        );

}

BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpvReserved)
{
    switch(fdwReason)
    {
        case DLL_PROCESS_ATTACH:
        {
            hInstance = hinstDLL;
            break;
        }
    }
    return TRUE;
}


2025-08-20 08:41
shschy
Rank: 2
等 级:论坛游民
帖 子:134
专家分:45
注 册:2022-3-13
收藏
得分:0 
请问这个editw控件在vfp9中工具-选项下设置吗?win10+vfp9上没发现。谢谢!
图片附件: 游客没有浏览图片的权限,请 登录注册
以下是引用吹水佬在2025-8-19 23:36:19的发言:

Windows带W的API和控件(EDITW)是支持Unicode,通常用STRCONV(UTF-8,12)就可以,但好像不支持这个C58B的UTF-8字符,不知是否与代码页有关。
用WEB控件试试

2025-08-20 08:46
快速回复:需要VFP9中显示国际音标如&#331;,但VFP9中读取包含Unicode字符的内容 ...
数据加载中...
 
   



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

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