找回密码
 点一下
查看: 2970|回复: 5

某人想要的UTF-8字符串函数...

[复制链接]
发表于 2006-4-3 00:35:23 | 显示全部楼层 |阅读模式
废话不多说老...
4个函数...

[jass]function Asc takes string char returns integer
    local string charMap = " !\"#$%%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~"
    local string u = SubString(char, 0, 1)
    local string c
    local integer i = 0
    if u == "" or u == null then
        return 0
    elseif u == "\b" then // Backspace?
        return 8
    elseif u == "\t" then // Horizontal Tab?
        return 9
    elseif u == "\n" then // Newline
        return 10
    elseif u == "\f" then // Form feed?
        return 12
    elseif u == "\r" then // Carriage return
        return 13
    endif
    loop
        set c = SubString(charMap, i, i + 1)
        exitwhen c == ""
        if c == u then
            return i + 32
        endif
        set i = i + 1
    endloop
    return 0
endfunction

function Chr takes integer i returns string
    if i == 0 then
        return null
    elseif i >= 8 and i <= 10 then
        return SubString("\b\t\n", i - 8, i - 7)
    elseif i >= 12 and i <= 13 then
        return SubString("\f\r", i - 12, i - 11)
    elseif i >= 32 and i <= 127 then
        return SubString(" !\"#$%%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~", i - 32, i - 31)
    endif
    return ""
endfunction[/jass]

以上两个函数功能就不说老
来源:http://www.wc3jass.com/viewforum ... bf46039f1955ae67afc
原作者:peppar
原来的函数名分别为AsciiCharToInteger()和AsciiIntegerToChar()
懒得查AscII表了,直接粘过来的

[jass]function UTFStringLength takes string s returns integer
    local integer len=0
    local integer index=0
    local integer asc
    local integer length=StringLength(s)
    local string ss
    loop
        exitwhen index>=length
        set ss=SubString(s,index,index+1)
        set asc=Asc(ss)
        if asc!=0 then
            set index=index+1
        else
            set index=index+3
        endif
        set len=len+1
    endloop
    return len
endfunction

function UTFSubString takes string s,integer start,integer end returns string
    local integer len=0
    local integer index=0
    local integer asc
    local integer length=StringLength(s)
    local string ss
    local integer ts
    local integer te
    loop
        exitwhen index>=length
        if len==start then
            set ts=index
        endif
        set ss=SubString(s,index,index+1)
        set asc=Asc(ss)
        if asc!=0 then
            set index=index+1
        else
            set index=index+3
        endif
        set len=len+1
        if len==end then
            set te=index
            return SubString(s,ts,te)
        endif
    endloop
    return ""
endfunction[/jass]

以上两个函数是为了支持UTF-8编码的中文字符串写的..
用法于原来的StringLength()和SubString()完全一样...
只是变成了按字符处理...

比如:
string s="中文ABC中文ABC"
UTFStringLength(s)=10
UTFSubString(s,1,8)="文ABC中文A"

还有什么想要实现滴跟贴...

[ 本帖最后由 白银の游戏王 于 2006-4-3 00:43 编辑 ]
发表于 2006-4-3 10:37:55 | 显示全部楼层
我想在PHP中实现的,就是直接粘贴中文TRIGGER.

你了提供改写的思路
回复

使用道具 举报

发表于 2006-4-3 11:58:38 | 显示全部楼层
在UTF-8编码下
虽然一般中文字符是占3字节
但是存在意外的
比如CJK扩展B区的汉子占4字节
特别是许多图形字符占2字节

string s=\"×÷&reg;αβγ\"
UTFStringLength(s) = 4
正确结果是6


UTF-8是变长编码,1~6字节的

我要的是支持Unicode的Asc、Chr函数
根据Unicode生成变长的UTF-8字符串

比如:
Asc(\"一\") = 0x4E00
Chr(0x4E00) = \"一\"

[ 本帖最后由 zyl910 于 2006-4-3 12:01 编辑 ]
回复

使用道具 举报

 楼主| 发表于 2006-4-3 12:22:49 | 显示全部楼层
理论上是可以实现滴...
如果真想写支持Unicode的Asc和Chr,把http://www.chinesecj.com/code/上的字全copy进来吧...

在WE中做那么复杂用处不大...
楼上最初的要求不也就是把\"中文ABC\"分开就行吗
万一遇到特例再改就是老...
回复

使用道具 举报

发表于 2006-4-3 13:04:05 | 显示全部楼层
\"中文ABC\"只是一个例子
我需要的是按字符处理字符串的办法
回复

使用道具 举报

发表于 2006-4-3 13:10:03 | 显示全部楼层
给你们看看我现在的进展:
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 点一下

本版积分规则

Archiver|移动端|小黑屋|地精研究院

GMT+8, 2024-12-22 14:55 , Processed in 0.032763 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表