| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
共有 626 人关注过本帖, 1 人收藏
标题:VFP9 for Unicode - ANSI/UTF-8 自由切换版
只看楼主 加入收藏
roadcom
Rank: 1
等 级:新手上路
帖 子:137
专家分:0
注 册:2026-7-9
收藏(1)
 问题点数:0 回复次数:7 
VFP9 for Unicode - ANSI/UTF-8 自由切换版
先前讨论过,只需直接将VFP代码保存为 UTF-8 编码,即可在代码当中直接使用 UTF-8 字符串字面量。在讨论的过程中,我们发现一个问题:

原版 VFP9 基于 ANSI 编码,会将代码中3字节的 UTF-8 字符,误判为2字节的 DBCS 字符,直接后果就是导致代码解析出错,无法正确编译。

这个“ANSI/UTF-8 自由切换版”比较完美地解决了这个问题。

解决方案的灵感,出自《三十六计》第十四计“借尸还魂”。我们改造了 VFP 系统内部一个已被官方废弃的函数 AnsiToOem,借用其接口,实现 VFP 字符编码在“双字节/单字节”之间即时相互切换。

用法如下:

AnsiToOem("UTF8"):立即切换至单字节模式
AnsiToOem("ANSI"):立即切换至双字节模式
默认值为:AnsiToOem("ANSI")

因 AnsiToOem 是 VFP 原生命令,你的代码当中若未用到 UTF-8 字符,那么是百分百兼容原版 VFP 系统的。

现在你可以自由地编写 UTF-8 编码的 VFP 代码啦!只需在编译前,执行一遍 AnsiToOem("UTF8"), UTF-8 代码即可正确编译。在程序当中,也可以随时随地地任意切换 ANSI/UTF-8 模式,打个比方,也就类似于 SET EXACT ON | OFF 那样子用法。

若遇任何问题,欢迎随时反馈!

- Have fun!

vfp9.rar (2.64 MB)
收到的鲜花
  • trial032026-08-05 08:44 送鲜花  1朵  
  • sych2026-08-05 11:51 送鲜花  1朵  
  • kangss2026-08-05 15:21 送鲜花  1朵  
搜索更多相关主题的帖子: 切换 字节 VFP VFP9 代码 
2026-08-04 19:50
roadcom
Rank: 1
等 级:新手上路
帖 子:137
专家分:0
注 册:2026-7-9
收藏
得分:0 
* ===================
* utf8test.prg
* UTF-8 编码的 VFP 代码演示
* (注:将以下代码复制/粘贴到记事本,保存为utf8test.prg,选【Utf-8 编码,无 BOM】)
* ===================
U1 = "乾☰ 坤☷ 震☳ 艮☶ 离☲ 坎☵ 兑☱ 巽☴☴"
U2 = "UTF-8 编码演示  اللغة العربية"

declare long MessageBoxW in 'Win32Api' Long, String, String, Long
lcText = strconv(u1, 12) + 0h0000
lcCaption = strconv(u2, 12) + 0h0000

MessageBoxW(0, lcText, lcCaption, 32)

return
* ===================

测试方法:
AnsiToOem("Utf-8")
do utf8test.prg


【私聊@所有人】
甭听 Roadcom 一本正经地胡说八道!
其实,函数 AnsiToOem 的改造,我们采用了“无限容错”模式。
你可以这样子调用:

转 UTF-8 模式:
AnsiToOem("Unicode")
AnsiToOem("uncle")
AnsiToOem("umbrella")
AnsiToOem("unfair")
AnsiToOem("u")
……字母U打头即可

转 ANSI 模式:
AnsiToOem("Anythins")
AnsiToOem("I love you!")
AnsiToOem("OK")
AnsiToOem("My god")
AnsiToOem("a")
……非字母U打头即可

2026-08-04 21:05
schtg
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:USA
等 级:贵宾
威 望:67
帖 子:2723
专家分:4967
注 册:2012-2-29
收藏
得分:0 
2026-08-05 05:56
roadcom
Rank: 1
等 级:新手上路
帖 子:137
专家分:0
注 册:2026-7-9
收藏
得分:0 
至此,对于 VFP 的 Unicode 改造,告一段落。

期间,我一直都在反复考量这个问题:

假如20年前便发现了这个【秘密】,且随随便便(说虽这样说,逆向分析技术一点一滴摸索起来,还真挺艰难的!呵呵。)就能做出一个补丁来,那么 VFP 匆促的谢幕历程,会不会有一点点不同?
试想,阿猫阿狗都能做出来的补丁,微软最后的VFP团队(虽小,最后好像也只剩几个人了),他们不可能不知道,也不可能做不到。
——可惜了!真是。

2026-08-05 10:41
trial03
Rank: 1
等 级:新手上路
帖 子:42
专家分:3
注 册:2025-1-20
收藏
得分:0 
大大, 可以在 form, report (.scx, .frx) 里使用吗?
2026-08-05 13:54
roadcom
Rank: 1
等 级:新手上路
帖 子:137
专家分:0
注 册:2026-7-9
收藏
得分:0 
以下是引用trial03在2026-8-5 13:54:48的发言:

大大, 可以在 form, report (.scx, .frx) 里使用吗?


那已是另一个话题了。一般我会推荐这个网址:
https://www.

打开网页,从头到尾读一遍。若阅读英文有困难,点右键,选【翻译为中文(简体)】。
照着网页上的例子,往表单添加 MS Form 2.0 等 Unicode 控件。
只是当时作者可能不知道 VFP 能直接编写 UTF-8 代码,有些步骤就略显多余了。

至于更细的细节,楼主恐怕帮不了你。

并非说,教微积分的,就不屑于教平面解析几何;而是——这话题,严格说来,根本就是只属于20年前的话题,而现在已是20年后!当时许多网上可随随便便找得到的破解版 Unicode ActiveX 控件,说实话,现在我还真不知该教你上哪儿找了!

我也只能憨厚地笑笑,耸耸肩,道一声:

亲,很遗憾,你晚到了20年。真的爱莫能助。

2026-08-05 19:50
roadcom
Rank: 1
等 级:新手上路
帖 子:137
专家分:0
注 册:2026-7-9
收藏
得分:0 
AnsiToOem("UTF8"):立即切换至单字节模式
AnsiToOem("ANSI"):立即切换至双字节模式

补丁的功能,本质上,是将 VFP 内部整个字符编码系统,在单字节与双字节之间相互切换。

有网友可能不明白:UTF-8 编码的汉字,一般是3字节,这跟单字节字符体系,有什么关系?小小地科普一下:

将 VFP 内部整个字符编码系统,切换为单字节,这跟 UTF-8 编码的汉字解析,关系确实并不大;
但是——重点是这个但是——让 VFP 以单字节的方式,逐个逐个地解析字符串,便能够令直接以 UTF-8 编码写出来的代码,不会被 VFP 解析错误!

不出错,这是写程序代码的底线;若随时都有可能意外出错,那么程序代码就无任何实用价值可言啦!

AnsiToOem 补丁的作用,就是让 VFP 正式地、安全地、全兼容地接纳 UTF-8 代码,期间绝无任何排斥与不良反应。

这就就好比,医生给病人开药,绝对不允许产生任何排斥与不良反应,这是底线!若用药过程中,发生任何不良反应,那就不是救人,而是害人、坑人啦!

这就是 AnsiToOem 补丁——给 VFP for Unicode 开的一剂良药,绝无任何排斥与不良反应。

至于,这个【底线】构筑好之后,如何充分利用 UTF-8 的优势,那是后续的 UTF-8 字符解析与处理的问题啦。
网上有许多开源的 UTF-8 编码解析处理的 C++ 库,直接编译成 DLL 调用即可。
印象中,在【我有一个秘密】帖子中就有一个现成编译好的。自己找找,下载来用。

2026-08-06 10:46
roadcom
Rank: 1
等 级:新手上路
帖 子:137
专家分:0
注 册:2026-7-9
收藏
得分:0 
那么,为什么要随时随地任意切换 单字节/双字节?

这便是 AnsiToOem 补丁,构筑的另一个【底线】:兼容性!

话说,你使用 VFP 十年、二十年甚至可能更长时间啦,一定积攒了成千上万行 VFP 程序代码。打一个补丁,结果成千上万行旧代码,全部报错,无法运行!——这显然是生命中不能承受之轻。

放心!AnsiToOem 补丁默认值是“双字节模式”,完全兼容传统 VFP 系统。这意味着,VFP 打了 AnsiToOem 补丁后,你什么都不必做,便可以放心地运行你那视若珍宝的成千上万行旧代码,绝不会出错!

当程序的运行,需要用到 UTF-8 代码,先执行 AnsiToOem("Utf-8"),然后便可放心大胆地运行 UTF-8 代码;
当程序的运行,需要用到 lenc、leftc、rightc、substrc 等带“C”的双字节汉字字符串处理函数,或一些VFP系统内部默认需判定 DBCS 字符边界的功能,先执行 AnsiToOem("Ansi"),然后便可放心大胆地运行传统 DBCS 代码。
这两种模式间的相互切换,是即时生效的,不会发生任何冲突。

韩氏整形美容医院有一句标志性广告语:
【上帝欠您的,韩氏还给您!】

请让我套用一下:
【微软欠您的,Roadcom 还给您!】

妹妹你大胆地往前走呀,往前走,莫回呀头!——放心大胆地在 VFP 中,写 UTF-8 代码吧!


2026-08-06 12:04
快速回复:VFP9 for Unicode - ANSI/UTF-8 自由切换版
数据加载中...
 
   
关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

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