demo-for-nc-text

混合字串概念上是指编码一致的中英或者说是Latin+GBK,Ascii+UniCode. 通俗的说就是中英混合字串的截断,当然GBK包含CJK(中日韩文字),通俗准确的说是单双字节字符混合字串。

其实用VS的话,可以引用SYSTEM.TEXT,然后使用encoding来直接操作字串,但是笔记本上实在跑不动VS2010…PHP的话,则可以直接用正则+mb_XXX函数来搞.. 为了本上的PHP环境,为了本上刚刚安装的石器时代(自己玩的单机)..咬了咬牙,不安VS了,忍痛安装了VB6精简版(10MB).. 很久木有写VB CODE了..都快忘记鸟…起手居然写了" function FirCut(){…“汗. 下面的代码应该很好修改优化提高效率.不过应该已经够用了…

'MAX BYTES EACH LINE.
Private Const MAX_ONE_LINE As Byte = 23 * 2

Private Sub FirCut(strContent As String)

    Dim bLen    As Byte: bLen = 0

    Dim strTemp As String

    Do While LenB(StrConv(strContent, vbFromUnicode)) > 0

        strTemp = StrConv(MidB$(StrConv(strContent, vbFromUnicode), 1, MAX_ONE_LINE), vbUnicode)

        bLen = LenB(StrConv(strTemp, vbFromUnicode))

        'echo result by yourself
        lstEvent.AddItem strTemp

        If LenB(StrConv(strContent, vbFromUnicode)) >= MAX_ONE_LINE Then

            If AscB(MidB$(StrConv(strContent, vbFromUnicode), MAX_ONE_LINE, 1)) Then
                strContent = StrConv(MidB$(StrConv(strContent, vbFromUnicode), MAX_ONE_LINE + 1, LenB(StrConv(strContent, vbFromUnicode)) - 1), vbUnicode)
            Else
                strContent = StrConv(MidB$(StrConv(strContent, vbFromUnicode), MAX_ONE_LINE, LenB(StrConv(strContent, vbFromUnicode))), vbUnicode)
            End If

        Else

            Exit Do

        End If

    Loop

End Sub

话说为啥要写这个呢,想起来了,这个主要用于南茜Nancy18-19基于SHANE007的HOOK汉化工具的字符处理. 007大神搞定的那个工具似乎在这两款游戏上有点不支持, 他自己的话是这么说的:

有一个特别注意点,今天才发现的,文本每行最多为24个全角汉字(或48个半角英文),但是每行最后1个字符不能为全角汉字,就是说实际上文本每行最多为23个全角汉字,最后要加2个半角空格。如果不满23个全角汉字就要换行就要补相应的半角空格。否则游戏崩溃。一个画面最多可输出约92个汉字(在目前大字体的情况下)。

所以,上面的代码就变成了下面的样子:

'每行允许汉字数目
Private Const MAX_ONE_LINE As Byte = 23 * 2
'23汉字后补助的空格数量
Private Const FIX_SPACES   As Byte = 1 * 2 

Private Sub FirCut(strContent As String)

    Dim bLen    As Byte: bLen = 0

    Dim strTemp As String

    Do While LenB(StrConv(strContent, vbFromUnicode)) > 0

        strTemp = StrConv(MidB$(StrConv(strContent, vbFromUnicode), 1, MAX_ONE_LINE), vbUnicode)

        bLen = LenB(StrConv(strTemp, vbFromUnicode))

        strTemp = strTemp & Space$(MAX_ONE_LINE - bLen) & Space$(FIX_SPACES)
'echo by yourself
        lstEvent.AddItem strTemp

        If LenB(StrConv(strContent, vbFromUnicode)) >= MAX_ONE_LINE Then

            If AscB(MidB$(StrConv(strContent, vbFromUnicode), MAX_ONE_LINE, 1)) Then
                strContent = StrConv(MidB$(StrConv(strContent, vbFromUnicode), MAX_ONE_LINE + 1, LenB(StrConv(strContent, vbFromUnicode)) - 1), vbUnicode)
            Else
                strContent = StrConv(MidB$(StrConv(strContent, vbFromUnicode), MAX_ONE_LINE, LenB(StrConv(strContent, vbFromUnicode))), vbUnicode)
            End If

        Else

            Exit Do

        End If

    Loop

End Sub

如果你看过代码,会发现没有对92个字符进行处理,也没有对如果换行的时候出现 这类字符的情况出现处理。 是的,或许这个代码需要安装了这个游戏的人去试验,遇到那个问题需要怎么做,如果译文翻页数目大于原文翻页数目会怎么样等。 我没有想下载那个游戏,也知道完全木有精力去调试007留下的HOOK TOOLS. 所以,代码给出来了,哪位愿意继续做就接着呗。 最后上传一个没有进行92字长判断和是否截断分页的DEMO程序,谁想下载看是神马意思就下了玩玩。

文件下载:[download id=“74”]