如何在SQL Server或MS Access中解码HTML数字字符引用文本?
没问题!不管你是用SQL Server还是链接的MS Access数据库,都能轻松把这些Numeric character reference(数字字符引用)转换成对应的正常文本。下面分别给你两种环境下的具体解决方案:
1. 在SQL Server中处理
SQL Server没有直接内置解码这类实体的函数,但我们可以自己写一个自定义标量函数来处理。这个函数会循环查找所有&#xxxx;格式的实体,把里面的十进制代码点转换成对应的Unicode字符:
CREATE FUNCTION dbo.DecodeNumericEntities(@Input NVARCHAR(MAX)) RETURNS NVARCHAR(MAX) AS BEGIN DECLARE @Result NVARCHAR(MAX) = @Input; DECLARE @Start INT, @End INT, @Code NVARCHAR(10); WHILE CHARINDEX('&#', @Result) > 0 BEGIN SET @Start = CHARINDEX('&#', @Result) + 2; SET @End = CHARINDEX(';', @Result, @Start); IF @End > 0 BEGIN SET @Code = SUBSTRING(@Result, @Start, @End - @Start); -- 将十进制代码点转换为Unicode字符 SET @Result = STUFF(@Result, @Start - 2, @End - @Start + 3, NCHAR(CAST(@Code AS INT))); END ELSE BREAK; -- 遇到不完整的实体格式时退出循环 END RETURN @Result; END
创建好函数后,就可以直接在查询中使用了:
SELECT dbo.DecodeNumericEntities('sweet shop') AS DecodedText;
执行后会得到结果:sweet shop
2. 在MS Access中处理
Access可以通过VBA自定义函数来实现解码,然后在查询中调用这个函数。步骤如下:
- 打开Access数据库,按下
Alt + F11打开VBA编辑器 - 插入一个新模块,粘贴下面的代码:
Function DecodeNumericEntities(ByVal InputText As String) As String Dim Result As String Dim StartPos As Integer, EndPos As Integer Dim CodeStr As String, Code As Integer Result = InputText Do While InStr(Result, "&#") > 0 StartPos = InStr(Result, "&#") + 2 EndPos = InStr(StartPos, Result, ";") If EndPos > 0 Then CodeStr = Mid(Result, StartPos, EndPos - StartPos) If IsNumeric(CodeStr) Then Code = CInt(CodeStr) -- 使用ChrW转换Unicode字符 Result = Left(Result, StartPos - 3) & ChrW(Code) & Mid(Result, EndPos + 1) Else -- 遇到非数字的代码点,直接保留原内容 Result = Left(Result, EndPos) & Mid(Result, EndPos + 1) End If Else Exit Do End If Loop DecodeNumericEntities = Result End Function
- 保存模块后,回到查询设计视图,编写查询调用这个函数:
SELECT DecodeNumericEntities("sweet shop") AS DecodedText;
执行查询后同样会得到sweet shop
小提示
上面的函数都只处理十进制的数字字符引用(&#xxxx;格式),如果你的文本里还有十六进制的格式(&#xXXXX;),可以扩展函数逻辑,把十六进制字符串转换成十进制再处理就行。
内容的提问来源于stack exchange,提问作者atreeon
相关产品推荐
相关产品推荐

