Xml 使用外语字符处理文本文件或字符串变量

Xml 使用外语字符处理文本文件或字符串变量,xml,vba,encoding,utf-8,Xml,Vba,Encoding,Utf 8,我想使用VBA函数,例如LCase$()和nextUCase()与我的test.xml文件一起使用,该文件是UTF-8编码的。下面的示例代码加载包含UTF-8内容的文件: Dim objFileSystem, objInputFile Set objFileSystem = CreateObject("Scripting.fileSystemObject") Set objInputFile = objFileSystem.OpenTextFile("c:\test.xml", 1) in

我想使用VBA函数,例如
LCase$()
和next
UCase()
与我的test.xml文件一起使用,该文件是UTF-8编码的。下面的示例代码加载包含UTF-8内容的文件:

Dim objFileSystem, objInputFile

Set objFileSystem = CreateObject("Scripting.fileSystemObject")
Set objInputFile = 
objFileSystem.OpenTextFile("c:\test.xml", 1)

inputData = objInputFile.ReadAll

objInputFile.Close
现在我尝试将内容转换为小写,然后将第一个字母改为大写

Var = inputData
Var = LCase$(Var)

Select Case Len(Var)

Case 0
CapitilizeFirstLetter = ""

Case 1
CapitilizeFirstLetter = UCase(Var)

Case Else
CapitilizeFirstLetter = Ucase(Left(Var, 1)) & mid(Var, 2)

End Select
我尝试以test_edited.xml的名称保存文件内容

FileUrl = "c:\test_edited.xml"

Set objStream = CreateObject("ADODB.Stream")
With objStream
    .Open
    .Charset = "utf-8" 'rosyjski iso-8859-5
    .Position = objStream.Size
    .WriteText=Var
    .Flush
    .Position = 0
    .Type     = 1 'binary
    .Read(3)      'skip BOM
    .SaveToFile FileUrl,2
    .Close
End With
Set objStream = Nothing
因此,第一个文件的内容是:

奈杰纳姆·杰希尼,莫利,这里是卡,兹普·瓦卡

第二个是现在

内贾兹尼·米什里·杰什里·恩尼,莫利,这里是卡卡,兹普·瓦卡

我还以为会是这样

奈杰纳姆ějěěěženy,莫利,这里是čka,zpěvačka

我做错了什么

我使用的是基本IDE6.4版

所有代码如下所示

Sub Main

'getting variable from outside
ChanNum = DDEInitiate("MacroEngine", "MacroGetVar")
Var$ = DDERequest$(ChanNum, "vChannelOpisA")
    DDETerminate ChanNum


Var = LCase$(Var) ' converting utf-8 encoded string to lower case

'change first letter to upper case
Select Case Len(Var)

Case 0
CapitilizeFirstLetter = ""

Case 1
CapitilizeFirstLetter = UCase(Var)

Case Else
CapitilizeFirstLetter = Ucase(Left(Var, 1)) & mid(Var, 2)

End Select

'sending variable to outside of vb script
ChanNum = DDEInitiate("MacroEngine","MacroSetVar")
Var = "vChannelOpisA=" + CapitilizeFirstLetter
DDEExecute (ChanNum, Var)
DDETerminate ChanNum

End Sub
名为Var的变量应最终进行utf-8编码,以将其写入xml文件。
我也可以从文件中读取字符串,而不是通过DDERequest获取字符串。

根据我的经验,Vba utf-8、iso 8859-1可能很棘手,因为它取决于文件源编辑器和系统环境,如果unix、windows或mac。。。大多数文本源编辑器或系统使用ANSI。我建议您尝试adodb,因为它可以读取并呈现utf-8,而另一个可以更好地写入utf-8

...
Set objStream = CreateObject("ADODB.Stream")
...
Dim ftxt As object
...

const bufFile = "c:\test.xml"
const stf = "c:\test_edited.xml"
Dim vData As Variant
Dim ftxt As TextStream
'ADODB
adoRead.Charset = "unicode"
adoRead.Open
adoRead.LoadFromFile bufFile
vData = Split(adoRead.ReadText, vbCrLf)
'ado object to write
Set fil = fso.GetFile(stf)
Set ftxt = fil.OpenAsTextStream(ForWriting, TristateUseDefault)

'process your data as intended
For j = LBound(vData) To UBound(vData)
   'code to capitalize...
   '...
   'write to
   ftxt.WriteLine vData(j)
Next j
这种结构适用于法语字符,我认为在utf-8或unicode字符集中应该是相同的

干杯


帕斯卡

经过三天的努力和研究,我终于得到了它。 如您所见,我的宏创建程序在windows-1250字符集下工作。 因此,我必须先将字符串转换为utf-8,最后再转换回windows-1250。 下面给出了适用于我的正确代码

Sub Main

' Retriving variable from outside vba
ChanNum = DDEInitiate("MacroEngine", "MacroGetVar")
Var$ = DDERequest$(ChanNum, "vChannelOpisA")
DDETerminate ChanNum


Dim objStream As Object

' Converting string variable from Windows-1250 to utf-8
Set objStream = CreateObject("ADODB.Stream")
objStream.Open
objStream.Type     = 2 'Specify stream type text data.
objStream.Charset  = "WIndows-1250" 'Specify charset For the source text data.
objStream.WriteText Var
objStream.Position = 0
objStream.Charset  = "utf-8"
Var = objStream.ReadText
objStream.Close


' Processing the string characters to lower case and change first letter to upper case
Var = LCase$(Var)

Select Case Len(Var)
Case 0
CapitilizeFirstLetter = ""
Case 1
CapitilizeFirstLetter = UCase(Var)
Case Else
CapitilizeFirstLetter = Ucase(Left(Var, 1)) & mid(Var, 2)
End Select

' Converting edited string back to WIndows-1250.
Set objStream = CreateObject("ADODB.Stream")
objStream.Open
objStream.Type     = 2 'Specify stream type text data.
objStream.Charset  = "utf-8" 'Specify charset For the source text data.
objStream.WriteText CapitilizeFirstLetter
objStream.Position = 0
objStream.Charset  = "WIndows-1250"
CapitilizeFirstLetter = objStream.ReadText
objStream.Close

' Sending string variable to my Macro engine
ChanNum = DDEInitiate("MacroEngine","MacroSetVar")
Var = "vChannelOpisA=" + CapitilizeFirstLetter
DDEExecute (ChanNum, Var)
DDETerminate ChanNum

End Sub
这里是一个例子,如果您想从文件中加载变量的数据

Sub Main

sFileToEdit = "c:\test.xml"
sFileEdited = "c:\test_edited.xml"


Dim objStream As Object

Set objStream = CreateObject("ADODB.Stream")
objStream.Type = 2 'Specify stream type - we want To save text/string data.
objStream.Charset = "utf-8" 'Specify charset For the source text data.
objStream.Open 'Open the stream And write binary data To the object
objStream.LoadFromFile sFileToEdit
ReadFileData = objStream.ReadText
objStream.Close

ReadFileData = LCase$(ReadFileData)

Select Case Len(ReadFileData)
Case 0
CapitilizeFirstLetter = ""
Case 1
CapitilizeFirstLetter = UCase(ReadFileData)
Case Else
CapitilizeFirstLetter = Ucase(Left(ReadFileData, 1)) & mid(ReadFileData, 2)
End Select


Set objStream = CreateObject("ADODB.Stream")
objStream.Type = 2 'Specify stream type - we want To save text/string data.
objStream.Charset = "utf-8" 'Specify charset For the source text data.
objStream.Open 'Open the stream And write binary data To the object
objStream.WriteText CapitilizeFirstLetter
objStream.SaveToFile sFileEdited, 2 'Save binary data To disk
objStream.Close

End Sub

似乎代码的某些部分正在更改字符代码页。也许我必须对一些变量进行不同的声明。上面的代码在我的基本环境中不起作用,并给我一个fail TextStream(0),它需要一个有效的数据类型(例如Integer)。我有Sax基本版,基本IDE标准版。它与.net对象的后期绑定有关。按照上面的代码设置objStream=CreateObject(“ADODB.Stream”),它应该与“dim-ftxt-as-object”一起工作,您所说的Pascal更改创建是什么意思。你能编辑你的代码并告诉我怎么做吗。以及如何插入大写代码的示例。在英国伦敦,时间不早了。我已经根据您的请求修改了上面的代码,但这很困难,因为您似乎没有提供您自己尝试运行的全部代码。请将您的代码全部放在一起(从开始到结束),以便从那里开始工作。请在空闲时间查看我编辑的代码Pascal。这对我很重要。我需要工作代码来继续我的主要工作。因此,感谢您的每一条建议。很抱歉,在我们交换意见后,无法进一步帮助您。有几件事需要关心。。。无论如何,这是一个很好的代码,它会花我很长时间去那里。做得好