VFP9如何正确识别并读取UTF-8、Unicode LE、Unicode BE等编码的TXT?

myfav 2015-02-14 04:00:54
其实,在这里主要想问的是UTF-8编码文本。
常见的判断UTF-8编码文本的VFP代码如下:

lcText = fileToStr([某文本.txt])
LcBMP1 = left(lcText,1)
LcBMP2 = substr(lcText,2,1)
LcBMP3 = substr(lcText,3,1)
if LcBMP1 = chr(239) and LcBMP2 = chr(187) and LcBMP3 = chr(191)
&&这是UTF-8 BMP,需转换为ANSI编码
lcANSI = Substr(lcText, 4)
lcANSI = Strconv(lcANSI,11)
...
endif

现在问题来了。

事实上,UTF-8编码是完全不需要BOM(文件头签名)的。我遇到过许多UTF-8文本文件,根本就不带文件头那三个字节的UTF-8标记,双击它,操作系统的“记事本”一样能正确显示,别的软件也都能正确识别,但我的程序却无法判断它是UTF-8,在VFP处理也自然是乱码。

请教:在VFP中,有没有通用、高效、准确的UTF-8编码文本的判断代码?
比如说,假设需批量处理几百、上千个TXT文件,文件格式各异,有可能是ANSI,也有可能是UTF-8、Unicode LE、Unicode BE等编码,这如何准确识别,尤其是如何高效地识别UTF-8,就挺关键啦。
...全文
1308 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
myfav 2015-02-15
  • 打赏
  • 举报
回复
非常感谢xuzuning与lygcw9602的帮助! 将两种方法结合一下,应该就能高效判断了。 xuzuning先生写的函数,确实比较巧妙,哈哈! 不过它对带BOM头的UTF-8文件无效,结合两种判断即可。 另, ? isutf8(LEFT(lcTest,10)) 需将left改为leftc,否则可能会因为类似“半个汉字”方面的原因,转换出错误结果。
xuzuning 2015-02-15
  • 打赏
  • 举报
回复
FUNCTION isutf8(lcTest)
  RETURN STRCONV(STRCONV(lcTest, 11), 9) = lcTest
ENDFUNC
应该说字符串长度越长效率越低,你可适当的减小他的规模,但一定要足以跳过前面的 ASCII 字符 lcTest = [ 这是一个测试文本,保存为UTF-8,不带BOM] ? isutf8(LEFT(lcTest)) 输出 .F. lcTest = [ 这是一个测试文本,保存为UTF-8,不带BOM] lcTest = Strconv(lcTest,9) ? isutf8(LEFT(lcTest)) 输出 .T. lcTest = [ 这是一个测试文本,保存为UTF-8,不带BOM] lcTest = Strconv(lcTest,9) ? isutf8(LEFT(lcTest,10)) 输出 .T.
lygcw9602 2015-02-14
  • 打赏
  • 举报
回复
到十豆三老师的博客中看看
myfav 2015-02-14
  • 打赏
  • 举报
回复
我举个简单的例子。如下VFP9代码将生成一个UTF-8编码、不带BOM的TXT文件,用顶楼的VFP9代码是无法正确判断UTF-8的,但操作系统能准确判断,双击它,记事本能打开并正确显示: lcTest = [这是一个测试文本,保存为UTF-8,不带BOM] lcUTF8 = Strconv(lcTest,9) =STRTOFILE(lcUTF8, [UTF8.txt])

2,723

社区成员

发帖
与我相关
我的任务
社区描述
VFP,是Microsoft公司推出的数据库开发软件,用它来开发数据库,既简单又方便。
社区管理员
  • VFP社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧