0

我有一个长文本需要转换为小字符串,以便我可以将其包含到 AutoIt 脚本中。如果我包含多行文本,它会显示error unterminated string. 所以我应该有:

"numbercharswillbe10" &_ "othernumbersofcharwillbe10" &_ etc..

如何使用& _-delimiters 拆分它?

4

1 回答 1

5

字符串连接

根据文档 - 语言参考 - 运算符

&连接/连接两个字符串。

&=串联赋值。

例子:

Global $g_sText = "Long " & "string " & "here." & @CRLF

$g_sText &= "More text." & @CRLF

ConsoleWrite($g_sText)

多行语句

根据文档 - 语言参考 - 评论(强调添加,因为它会导致提到的“未终止的字符串”错误):

虽然每行只允许一个语句,但如果_在“断”行的末尾放置一个以空格开头的下划线“”,则长语句可以跨越多行。字符串定义不能拆分成多行,需要使用连接。

例子:

Global Const $g_sText = "Long " & _
                        "string " & _
                        "here." & _
                        @CRLF & _
                        "More text." & _
                        @CRLF

ConsoleWrite($g_sText)

双引号

根据文档 - 常见问题解答 - 双引号

如果要在字符串中使用双引号,则必须“将它们加倍”。因此,对于您想要的每一个报价,您应该使用两个。...

或使用单引号代替...

可从源代码获取示例。

默认值和限制

根据文档 - 附录 - 限制/默认值

4095一行脚本的最大大小。

2,147,483,647最大字符串长度。

根据文档 - 语言参考 - 数据类型 - 字符串

所有 AutoIt 字符串都使用 UTF-16(实际上更准确地说是 UCS-2)编码。

根据文档 - 介绍 - Unicode 支持

AutoIt 的一些部分还没有完全的 Unicode 支持。这些是:

  • Send 和 ControlSend - 改为使用 ControlSetText 或剪贴板函数。
  • 控制台操作转换为 ANSI。
  • 备择方案

    硬编码的替代方案包括ClipGet()FileRead().

    剪贴板中的文本

    示例(选择并复制文本CTRL+C首先):

    Global Const $g_sText = ClipGet()
    
    ConsoleWrite($g_sText & @CRLF)
    

    文件中的文本

    示例(C:\my_long_string.txt先创建):

    #include <FileConstants.au3>
    
    Global Const $g_sFile = 'C:\my_long_string.txt'
    Global Const $g_sText = _TextFromFile($g_sFile)
    
    ConsoleWrite($g_sText & @CRLF)
    
    Func _TextFromFile(Const $sFile)
        Local       $hFile = FileOpen($sFile, $FO_READ + $FO_UTF8_NOBOM)
        Local Const $sData = FileRead($hFile)
    
        FileClose($hFile)
        Return $sData
    EndFunc
    

    拆分字符串

    硬编码手动字符串拆分的替代方法包括StringSplit()_StringExplode()相关)和StringMid().

    结构

    StringSplit()将字符串拆分为以下数组:

    • 单个字符(在空分隔符上),
    • 单词(在空格分隔符上)或
    • 行(在@CRLF@LF分隔符上@CR)。

    等长

    StringMid()返回字符串的一部分。可以用来分割成等长的部分。示例(无错误检查,选择并复制文本CTRL+C先):

    #include <Array.au3>
    
    Global Const $g_iSize  = 10
    Global Const $g_sText  = ClipGet()
    Global Const $g_aArray = _StringSplitEqual($g_sText, $g_iSize)
    
    _ArrayDisplay($g_aArray)
    
    Func _StringSplitEqual(Const $sText, Const $iSize = 1)
        Local Const $iLength = StringLen($sText)
        Local Const $iParts  = Ceiling($iLength / $iSize)
        Local Const $iRest   = -1; $iLength - ($iSize * Floor($iLength / $iSize))
        Local       $iStart  = 0
        Local       $iCount  = 0
        Local       $aArray[$iParts]
    
        For $i1 = 0 To $iParts - 1
    
            $iStart      = ($i1 * $iSize) + 1
            $iCount      = ($i1 < $iParts - 1) ? $iSize : ($iRest ? $iRest : $iSize)
            $aArray[$i1] = StringMid($sText, $iStart, $iCount)
    
        Next
    
        Return $aArray
    EndFunc
    

    加入字符串

    根据文档

    _ArrayToString
    将 1D 或 2D 数组的元素放入单个字符串中,由指定的分隔符分隔

    示例(添加_StringSplitEqual()并选择并复制文本CTRL+C先):

    #include <Array.au3>
    
    Global Const $g_iSize      = 10
    Global Const $g_sStart     = '$sText = "'
    Global Const $g_sEnd       = '"' & @CRLF
    Global Const $g_sDelimiter = '" _' & @CRLF & '       & "'
    Global Const $g_sText      = StringReplace(ClipGet(), @CRLF, '')
    Global Const $g_aArray     = _StringSplitEqual($g_sText, $g_iSize)
    Global       $g_sResult    = _ArrayToString($g_aArray, $g_sDelimiter)
    
    $g_sResult = $g_sStart & $g_sResult & $g_sEnd
    ConsoleWrite($g_sResult)
    

    回报:

    $sText = "AutoIt v3 " _
           & "is a freew" _
           & "are BASIC-" _
           & "like scrip" _
           & "ting langu" _
           & "age design" _
           & "ed for aut" _
           & "omating th" _
           & "e Windows " _
           & "GUI and ge" _
           & "neral scri" _
           & "pting."
    
    于 2017-06-03T01:49:26.310 回答