[问题]如何在UTF8下得到汉字拼音

bugx 2008-01-22 06:58:12
比如 “汉” 可以得到 han
这样的拼音。
GB2312下是可以解决了。但是在UTF8下就郁闷了。ASC码和UNICODE编码不一样。
我用一个UTF-8转GB的函数放在一个文件下,比如1.asp
根据ASC码获得拼音是2.asp
实际用到的页面是3.asp
那么我把3.asp改为UTF-8编码,1.asp也是UTF-8编码
3.asp里这样写道
Dim py,a
Set py= new PinYinObject
a="汉"
response.write a
response.write "<br/>----------------------------------<br/>"
response.write AscW(a)
response.write "<br/>----------------------------------<br/>"
response.write py.GetPinYin("汉",false,false)

前面2个输出只是看看而已,关键最后面的。
当我是GB2312的时候肯定没有问题。输出如下:

----------------------------------
27721
----------------------------------
han
当把3.asp转为utf-8的页面的时候,在response.write a之前调用UTF82GB的函数,改为
a="汉字"
a=UTF2GB(a)
这时输出的ascw是23033
这样肯定不对了。是unicode的编码了。用ascB来得是249
怎么做才能把UTF-8的汉字转为拼音呢?
还有为什么UTF8的时候ascw后面加一个汉字会出现“未结束的字符串”错误。是字节长度上太长了?那怎么来只有一个汉字做字符串传入呢?
当然实际上ascb("汉")和ascb("汉字")是一样的结果,因为只取前一个。

...全文
669 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
ran888888 2009-02-23
  • 打赏
  • 举报
回复
可是你这个方法对下面的大多数字要出错啊!
"职选蒋赛饭落过装节被赛自马辰评英获茜胜还肤肌表评项首错误范返"
哼哼......
bugx 2008-07-29
  • 打赏
  • 举报
回复
恩,这个我后来采用方法,UTF8先转GB,再转拼音
wtogether 2008-06-05
  • 打赏
  • 举报
回复
HOHO,有个错误的地方,objStream.WriteText strName改称objStream.WriteText strData,做调试来者,没改变量名
wtogether 2008-06-05
  • 打赏
  • 举报
回复
codepage设置成65001的时候,Asc是取不到汉字的ANSI码的,很多utf-8的开发者都没注意到这个问题,单纯的把codepage设置成65001,用65001编码要改变些观念,在936下的含有Asc的函数都不适应65001的,65001就只能用ChrW

做对照表是个办法,用AscW取Unicode编码,然后找到对应的GB2312编码,需要点内存和检索速度,或者可以用ADODB.Stream这个强大的东东来转换编码

'数字lValue左移iBit位
Public Function LShift(ByVal lValue, ByVal iBit)
LShift = lValue * (2 ^ iBit)
End Function

'整合高低位字节为整数
Public Function MAKEWORD(ByVal iHigh, ByVal iLow)
MAKEWORD = (iHigh And &HFF) Or LShift((iLow And &HFF), 8)
End Function

'将Unicode字符串转换成GBK编码数组
'该函数用于CodePage=65001环境
Public Function UTF8ToANSIArray(ByVal strData)
Dim objStream
Dim ret, i, k
Set objStream = Server.CreateObject("ADODB.Stream")
objStream.Type = 2
objStream.Mode = 3
objStream.Charset = "gbk"
objStream.Open
objStream.WriteText strName
objStream.Position = 0
objStream.Type = 1
ReDim ret(objStream.Size - 1)
For i = 0 To UBound(ret)
ret(i) = AscB(objStream.Read(1))
Next
k = 0
For i = 0 To UBound(ret)
If ret(i) < 128 Then
ret(k) = ret(i)
Else
ret(k) = MAKEWORD(ret(i + 1), ret(i))
i = i + 1
End If
k = k + 1
Next
ReDim Preserve ret(k - 1)
objStream.Close
Set objStream = Nothing
UTF8ToANSIArray = ret
End Function

<%@language="vbscript" codepage="65001"%>
<%
Option Explicit

Response.CharSet = "utf-8"

Dim strName
strName = Request.QueryString("name")
If Not IsEmpty(strName) Then
Response.Write Request.ServerVariables("QUERY_STRING") & "<br/>"
Response.Write strName & "<br/>"
Response.Write Chr(&HD5C5) & "<br/>"
Response.Write Join(UTF8ToANSIArray(strName), ",")
End If
'把上面提供的函数加入到这里来
%>
<form action="test.asp" method="get">
<input name="name" type="text" />
<input type="submit" />
</form>

但这还是舍本求末的方法,因为动用了组件,远没有Asc快
mrshelly 2008-06-05
  • 打赏
  • 举报
回复
做个UTF8的对照表就行了.
littlelam 2008-06-05
  • 打赏
  • 举报
回复
文件编码也要是utf-8的
bugx 2008-06-05
  • 打赏
  • 举报
回复
UTF8下转主要是编码表不同,所以。。。。。。。。。。我也不知道了
翼帆 2008-03-12
  • 打赏
  • 举报
回复
在线等,我顶·!!
bugx 2008-01-22
  • 打赏
  • 举报
回复
Response.CharSet = "utf-8"
Session.CodePage = 65001

这个我都加了
tantaiyizu 2008-01-22
  • 打赏
  • 举报
回复
加上
Response.charset = "utf-8"

28,409

社区成员

发帖
与我相关
我的任务
社区描述
ASP即Active Server Pages,是Microsoft公司开发的服务器端脚本环境。
社区管理员
  • ASP
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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