标题:DBF表导入UTF-8格式文本时的乱码问题
只看楼主
huasinstamps
Rank: 2
等 级:论坛游民
帖 子:50
专家分:21
注 册:2017-6-1
结帖率:85.71%
已结贴  问题点数:20 回复次数:15 
DBF表导入UTF-8格式文本时的乱码问题
现在win10保存txt文本文件时是默认用UTF-8格式,当DBF表导入UTF-8格式的txt文本时,中文字符都成了乱码。SDF这个参数好像只适用于ANSI格式的文本。

把文本另存为ANSI格式是可以解决乱码问题,但麻烦了点。请教各位老师和前辈,有没有更好的办法。我用的是VFP6。谢谢!
搜索更多相关主题的帖子: 格式 文本 DBF 导入 乱码 
2022-08-09 21:23
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:323
帖 子:9621
专家分:26174
注 册:2012-2-5
得分:4 
发上UTF-8格式的txt文本看看

坚守VFP最后的阵地
2022-08-09 22:29
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:4 
转码
数据转码或文件转码
2022-08-10 07:56
laowan001
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:54
帖 子:802
专家分:1914
注 册:2015-12-30
得分:4 
楼上吹版所言极是,遇到乱码可尝试各种可能的转码,测试转码后的文本是否正常,之前我就因为一段文本尝试了各种转换,最终找到了答案
但如果是多次转码的文本就比较麻烦了,需要对不同编码的文本特征有所了解
2022-08-10 13:51
huasinstamps
Rank: 2
等 级:论坛游民
帖 子:50
专家分:21
注 册:2017-6-1
得分:0 
以下是引用sdta在2022-8-9 22:29:00的发言:

发上UTF-8格式的txt文本看看


就是普通的txt文本,内容是用中文字符,在window10直接保存都是UTF-8格式的。用append sdf导入到dbf表后中文就成了乱码。


[此贴子已经被作者于2022-8-10 18:00编辑过]

2022-08-10 17:47
huasinstamps
Rank: 2
等 级:论坛游民
帖 子:50
专家分:21
注 册:2017-6-1
得分:0 
以下是引用吹水佬在2022-8-10 07:56:09的发言:

转码
数据转码或文件转码


吹老师数据转码的语句是什么
2022-08-10 17:50
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
回复 6楼 huasinstamps
函数 STRCONV()
2022-08-10 18:08
huasinstamps
Rank: 2
等 级:论坛游民
帖 子:50
专家分:21
注 册:2017-6-1
得分:0 
回复 7楼 吹水佬
这个在vfp6试过不能用,我参考过以前的帖子,据说只在在vfp9中用。
2022-08-10 19:17
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
以下是引用huasinstamps在2022-8-10 19:17:29的发言:

这个在vfp6试过不能用,我参考过以前的帖子,据说只在在vfp9中用。

vfp6的STRCONV()不支持UTF-8转码,可以试试用API或其他脚本写。
API函数:WideCharToMultiByte、MultiByteToWideChar
程序代码:
DECLARE long WideCharToMultiByte IN kernel32 long,long,string,long,string@,long,string@,long
DECLARE long MultiByteToWideChar IN kernel32 long,long,string,long,string@,long
#define CP_UTF8    65001
#define ERROR_NO_UNICODE_TRANSLATION    1113

cUtf8 = AnsiToUtf8("中国")
? Utf8ToAnsi(cUtf8)
RETURN

FUNCTION AnsiToUtf8(cAnsi)
    LOCAL WChar, WCharSize, cUtf8
    WChar = STRCONV(cAnsi+CHR(0),5)
    WCharSize = WideCharToMultiByte(CP_UTF8, 0, WChar, -1, NULL, 0, NULL, 0)
    IF WCharSize==0 OR WCharSize==ERROR_NO_UNICODE_TRANSLATION
        RETURN ""
    ENDIF
    cUtf8 = SPACE(WCharSize)
    IF WideCharToMultiByte(CP_UTF8,0,WChar,-1,@cUtf8,WCharSize,NULL,0) != WCharSize
        RETURN ""
    ENDIF
    RETURN cUtf8
ENDFUNC

FUNCTION Utf8ToAnsi(cUtf8)
    LOCAL WCharSize, buf
    WCharSize = MultiByteToWideChar(CP_UTF8, 0, cUtf8, -1, NULL, 0)
    IF WCharSize==0 OR WCharSize==ERROR_NO_UNICODE_TRANSLATION
        RETURN ""
    ENDIF
    buf = SPACE(WCharSize*2)    && 要足够大
    IF MultiByteToWideChar(CP_UTF8,0,cUtf8,-1,@buf,WCharSize) != WCharSize
        RETURN ""
    ENDIF
    buf = STRCONV(buf,6)
    RETURN LEFT(buf,AT(CHR(0),buf)-1)
ENDFUNC
2022-08-10 21:16
cssnet
Rank: 4
等 级:业余侠客
威 望:4
帖 子:317
专家分:203
注 册:2013-10-4
得分:4 
为什么要重新发明车轮呢?VFP9几乎完全兼容VFP6。
楼主且随手将24年前的老掉牙古董VFP6,换成15年前的老掉牙古董VFP9便是了!——区别也不过就是:可能前者掉了12颗牙,而后者掉了8颗牙,仅仅是“量”的差别而已,根本没有“质”的差别!试问:五十步和一百步,难道有区别么?——具体到这一个STRCONV()函数的小问题,感觉上,在这上头哪怕多花一丁点的气力,便都是纯属多余的!
呵呵。
2022-08-10 22:38



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-509751-1-1.html




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

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