로 유니 코드 문자열을 조작하는 기능 내장 VB6 소스 코드 내의 문제 대부분의 사용 가능한 컨트롤과 함께 실행되는 문자열 리터럴.
당신 :
CreateRecordset.Open "Exec sp_Insert_item 1, 101, N'Ħass'", conn, adOpenForwardOnly
는 실제로 :
CreateRecordset.Open "Exec sp_Insert_item 1, 101, N'Hass'", conn, adOpenForwardOnly
... 당신이 거기에 붙여 넣기 한 후.
이것은 내가 자주 클래스 I를 사용하여이 문제를 해결할 수있는 흔한 종류의 일입니다. 물론 슬프게도 런타임에는 작동하지만 코드에서 ChrW $() 호출을 문자열 리터럴 내에서 연결하는 방법을 능가합니다.
대개 .CLS 파일을 편집하여 전역, 미리 선언 된 인스턴스 (VB6 .FRM 모듈과 마찬가지로 모듈 이름에 대해 이름이 지정된 "무료"Form 인스턴스가 제공됨)가되도록 Attribute VB_PredeclaredId = True
을 편집합니다. 그러나 당신은 물론 그것을 할 필요가 없습니다.
정의 된 한 가지 방법이 있습니다. 내 전체 버전 Escer
도 Escape
"기타 방법"으로 사용되는 방법이 있습니다. 설정 등의 직렬화에 유용합니다.
CreateRecordset.Open EscerLite.UnEscape("Exec sp_Insert_item 1, 101, N'^u0126ass'"), _
conn, _
adOpenForwardOnly
하지만 당신은() 호출 자신의 계획을 요리하거나 CHRW의 $를 사용할 수 있습니다
이 당신이 작성할 수 있습니다.
EscerLite.cls
Option Explicit
Private Enum UnEscStates
uesNotInEscapeSeq = 0
uesProcessingEscSeq = 1
uesProcessingLongEscSeq = 2
uesProcessingLongEscSeqXEnd = 3
uesProcessingLongEscSeqUEnd = 5
End Enum
Public Function UnEscape(ByVal EscapedText As String) As String
'Un-escape a string value. Escape sequences supported:
'
' ^xhh 7 bit hex ^r vbCr
' ^uhhhh 16 bit hex ("Unicode") ^l vbLf
' ^b vbBack ^n vbNewLine/vbCrLf
' ^t vbTab ^q quote (")
' ^v vbVerticalTab ^0 vbNullChar
' ^f vbFormFeed ^^ ^
Dim Pos As Long
Dim ChS As String
Dim ChW As Integer
Dim UpChW As Integer
Dim UnEscState As UnEscStates
Dim UnPos As Long
Dim Unicode As Boolean
Dim Accum As Long
UnEscape = Space$(Len(EscapedText))
UnPos = 1&
For Pos = 1& To Len(EscapedText)
ChS = Mid$(EscapedText, Pos, 1&)
ChW = AscW(ChS)
UpChW = AscW(UCase$(ChS))
Select Case UnEscState
Case uesNotInEscapeSeq
If ChW = 94# Then ' "^"
UnEscState = uesProcessingEscSeq
End If
Case uesProcessingEscSeq
UnEscState = uesNotInEscapeSeq
Select Case UpChW
Case 88# ' "X"
UnEscState = uesProcessingLongEscSeq
Case 85# ' "U"
Unicode = True
UnEscState = uesProcessingLongEscSeq
Case 66# ' "B"
ChS = vbBack
Case 84# ' "T"
ChS = vbTab
Case 86# ' "V"
ChS = vbVerticalTab
Case 70# ' "F"
ChS = vbFormFeed
Case 82# ' "R"
ChS = vbCr
Case 76# ' "L"
ChS = vbLf
Case 78# ' "N"
Mid$(UnEscape, UnPos, 1&) = vbCr
UnPos = UnPos + 1
ChS = vbLf
Case 81# ' "Q"
ChS = """"
Case 48# ' "0"
ChS = vbNullChar
Case 94# ' "^", i.e. ^^
'
Case Else
Err.Raise 5
End Select
Case Else
If (48# <= UpChW And UpChW <= 57#) Then
Accum = 16& * Accum + (CLng(UpChW) And &HF&)
ElseIf (65# <= UpChW And UpChW <= 70#) Then
Accum = 16& * Accum + (CLng(UpChW) - 55&)
Else
Err.Raise 5
End If
UnEscState = UnEscState + 1&
If Unicode Then
If UnEscState > uesProcessingLongEscSeqUEnd Then
ChS = ChrW$(Accum)
Accum = 0&
UnEscState = uesNotInEscapeSeq
Unicode = False
End If
Else
If Accum > 127 Then Err.Raise 5
If UnEscState > uesProcessingLongEscSeqXEnd Then
ChS = ChrW$(Accum)
Accum = 0&
UnEscState = uesNotInEscapeSeq
End If
End If
End Select
If UnEscState = uesNotInEscapeSeq Then
Mid$(UnEscape, UnPos, 1&) = ChS
UnPos = UnPos + 1&
End If
Next
If UnEscState <> uesNotInEscapeSeq Then Err.Raise 5
UnEscape = Left$(UnEscape, UnPos - 1&)
End Function
유니 코드 문자는 텍스트 상자에서 데이터를 검색/표시 할 때 손실되지 않습니다. 그러나 SQL 서버에 쓰려고 할 때. 내 코드가 아래와 같지만 여전히 "Ħass"텍스트가 텍스트 상자에서 올바르게 검색되었습니다. 'CreateRecordset = 새 adodb.Recordset을 설정하십시오. CreateRecordset.Open "Exec sp_Insert_item 1, 101, N'assass" ", conn, adOpenForwardOnly' –
@WarrenRox : 로컬 코드 페이지에 텍스트를 입력하면 VB 코드가 올바르게. 다른 코드 페이지에 텍스트를 입력 할 때 컨트롤 만 바꾸면됩니다. – Deanna