קידוד URL לעברית באמצעות VBA
-
חיפשתי ולא מצאתי את הקידוד שנעשה בURL עבור עברית (כל מה שיש נותן תוצאות לא טובות בכלל, כנראה בנוי על שפות אחרות), ועל כן החלטתי לכתוב לבד קוד, שאיננו מבוסס על אלגוריתם, אלא על מידע סטטי בלבד
הנה הקוד, אם יש למישהו הערות אשמח לשמוע, נראה לי שלא כיסיתי את כל התווים, כמו"כ אם מישהו מכיר את האלגוריתם אולי כדאי להכיר אותו.
קרדיט לאתר שדרכו ידעתי את החומראולם לצערי הרב יש שם באג מוזר שהוא איננו מזהה אותיות סופיות בעברית, כלומר הוא מחזיר לאות "מ" ולאות "ם" את אותו ערך.
אני יודע שככה SQL מתנהג אבל VB???? מי נתן לו רשות להבין בשבילי את האותיות העבריות???
האם יש למישהו הסבר לזה????
הנה הקוד
Function EncodeOneCharToURL(char As String) Dim Encode As String Select Case char Case "א" Encode = "%D7%90" Case "ב" Encode = "%D7%91" Case "ג" Encode = "%D7%92" Case "ד" Encode = "%D7%93" Case "ה" Encode = "%D7%94" Case "ו" Encode = "%D7%95" Case "ז" Encode = "%D7%96" Case "ח" Encode = "%D7%97" Case "ט" Encode = "%D7%98" Case "י" Encode = "%D7%99" Case "כ" Encode = "%D7%9B" Case "ך" Encode = "%D7%9A" Case "ל" Encode = "%D7%9C" Case "מ" Encode = "%D7%9E" Case "ם" Encode = "%D7%9D" Case "נ" Encode = "%D7%A0" Case "ן" Encode = "%D7%9F" Case "ס" Encode = "%D7%A1" Case "ע" Encode = "%D7%A2" Case "פ" Encode = "%D7%A4" Case "ף" Encode = "%D7%A3" Case "צ" Encode = "%D7%A6" Case "ץ" Encode = "%D7%A5" Case "ק" Encode = "%D7%A7" Case "ר" Encode = "%D7%A8" Case "ש" Encode = "%D7%A9" Case "ת" Encode = "%D7%AA" Case " " Encode = "+" Case """" Encode = "%22" Case "'" Encode = "%27" Case Else Encode = char End Select EncodeOneCharToURL = Encode End Function Public Function URLEncode(ByVal StringToEncode As String) As String Dim currentCar As String, Result As String For i = 1 To Len(StringToEncode) currentCar = Mid(StringToEncode, i, 1) Result = Result & EncodeOneCharToURL(currentCar) Next URLEncode = Result End Function
פורסם במקור בפורום CODE613 ב29/07/2013 01:46 (+03:00)
-
כדי שלא יחליף לך בין אותיות אמצעיות לסופיות נסה לכתוב במקום
CASE "ם" (CASE CHR(141
או שתעשה כך
Function EncodeOneCharToURL(char As Byte) Dim Encode As String Select Case char Case 128 Encode = "%D7%90" Case 129 Encode = "%D7%91" '..... End Function
וההסבר הוא שיש Binary Compare ויש Text Compare
מה שאתה עשית כנראה שVBA מפרש כמו השוואה של טקסט ובטקסט מ' ום' שוות אבל מבחינה בינארית יש חילוק בינהם ולהם הצעתי שהבדיקה תהיה בינארית.פורסם במקור בפורום CODE613 ב29/07/2013 08:31 (+03:00)
-
אם יש לך עוד בעיות,
השתמש אולי בקוד זה (אצלי עובד מצויין):Private Const CP_UTF8 = 65001 Private Declare PtrSafe Function WideCharToMultiByte Lib "Kernel32" (ByVal CodePage As Long, ByVal dwflags As Long, ByVal lpWideCharStr As Long, ByVal cchWideChar As Long, ByVal lpMultiByteStr As Long, ByVal cchMultiByte As Long, ByVal lpDefaultChar As Long, ByVal lpUsedDefaultChar As Long) As Long Public Function UTF16To8(ByVal UTF16 As String) As String Dim sBuffer As String Dim lLength As Long If UTF16 <> "" Then lLength = WideCharToMultiByte(CP_UTF8, 0, CLng(StrPtr(UTF16)), -1, 0, 0, 0, 0) sBuffer = Space$(lLength) lLength = WideCharToMultiByte(CP_UTF8, 0, CLng(StrPtr(UTF16)), -1, CLng(StrPtr(sBuffer)), Len(sBuffer), 0, 0) sBuffer = StrConv(sBuffer, vbUnicode) UTF16To8 = Left$(sBuffer, lLength - 1) Else UTF16To8 = "" End If End Function Public Function URLEncode( _ StringVal As String, _ Optional SpaceAsPlus As Boolean = False, _ Optional UTF8Encode As Boolean = True _ ) As String Dim StringValCopy As String: StringValCopy = IIf(UTF8Encode, UTF16To8(StringVal), StringVal) Dim StringLen As Long: StringLen = Len(StringValCopy) If StringLen > 0 Then ReDim result(StringLen) As String Dim I As Long, CharCode As Integer Dim Char As String, Space As String If SpaceAsPlus Then Space = "+" Else Space = "%20" For I = 1 To StringLen Char = Mid$(StringValCopy, I, 1) CharCode = Asc(Char) Select Case CharCode Case 97 To 122, 65 To 90, 48 To 57, 45, 46, 95, 126 result(I) = Char Case 32 result(I) = Space Case 0 To 15 result(I) = "%0" & Hex(CharCode) Case Else result(I) = "%" & Hex(CharCode) End Select Next I URLEncode = Join(result, "") End If End Function
לקוח מפה http://stackoverflow.com/questions/218181/how-can-i-url-encode-a-string-in-excel-vba
עם התאמות קלות ל64 ביט.פורסם במקור בפורום CODE613 ב31/07/2013 17:59 (+03:00)
-
בגדול צריך להמיר קודם לutf8 ואחריזה לעשות את זה בפורמט url %XX
זה ממש פשוט לעשות את זה עם נעזרים בויקיפדיה http://he.wikipedia.org/wiki/UTF-8
עשיתי את זה בjs פשוט .
// המרת עברית ל utf-8 ואחרי זה ל url // מקור http://he.wikipedia.org/wiki/UTF-8 // פונקציה שממירה מספר לפורמט url %XX function toHex(chr){ chr = chr.toString(16) ; return "%" + (chr.length == 1 ? "0" :"" ) + chr; } var strIn = "אבגד"; var strOut = '' for (i = 0 ; i < strIn.length ; i++ ) { // המרת תו למספר יוניקוד var chr = strIn.charCodeAt(i); if( chr <= 0x7F ) strOut += toHex(chr); else if( chr <= 0x7FF ) { strOut += toHex((( chr >> 6) & 0x1f ) | 0xc0 ) ; strOut += toHex(( chr & 0x3f ) | 0x80 ) ; } } $("#r").text(strOut);
אפשר לראות דוגמא חיה פה http://jsfiddle.net/yrRdG/
בשביל לכתוב את זה ב vba אתה משתמש בפונקציה chrW כדי לקבל את הקוד יוניקוד של התו.
פורסם במקור בפורום CODE613 ב31/07/2013 22:14 (+03:00)
-
@דוד ל.ט.
אם לא היה מדובר בVBA, זה שורת קוד אחת בC#.
זה לא נקרא שורה אחת ב c#.
זה לא קשור לשפת c# שזה נהפך לשורה אחת.
גם בjs זה שורה אחת בגלל שיש פונקציה כזאת שעושה את זה. וגם בphp וגם בpython וגם בvba זה יהיה שורה אחת אחרי שתעשה פונקציה כזאת.אני הבאתי את האלגוריתם שעושה את זה בלי פונקציה הבאתי את זה בjs בגלל שאני על לינוקס ואני לא יכול לכתוב בvba והשפה שהכי קל לכתוב בה אוןלין זה js.
פורסם במקור בפורום CODE613 ב03/08/2013 23:59 (+03:00)
-