דילוג לתוכן
  • דף הבית
  • קטגוריות
  • פוסטים אחרונים
  • משתמשים
  • חיפוש
  • חוקי הפורום
כיווץ
תחומים

תחומים - פורום חרדי מקצועי

💡 רוצה לזכור קריאת שמע בזמן? לחץ כאן!
  1. דף הבית
  2. תכנות
  3. ארכיון code613m
  4. קידוד URL לעברית באמצעות VBA

קידוד URL לעברית באמצעות VBA

מתוזמן נעוץ נעול הועבר ארכיון code613m
9 פוסטים 4 כותבים 672 צפיות
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • א מנותק
    א מנותק
    ארכיטקט
    כתב ב נערך לאחרונה על ידי
    #1

    חיפשתי ולא מצאתי את הקידוד שנעשה ב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)

    אידיאולוגיות גדולות נכנסות למטחנה של עולם המעשה ויוצאות ממנו בפירורים (ווינסטון צ'רצ'יל, סתם סתם, זה שלי)

    תגובה 1 תגובה אחרונה
    0
    • רחמיםר מנותק
      רחמיםר מנותק
      רחמים מורחק
      כתב ב נערך לאחרונה על ידי
      #2

      כדי שלא יחליף לך בין אותיות אמצעיות לסופיות נסה לכתוב במקום

      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)

      תגובה 1 תגובה אחרונה
      0
      • dovidD מנותק
        dovidD מנותק
        dovid ניהול
        כתב ב נערך לאחרונה על ידי
        #3

        אם יש לך עוד בעיות,
        השתמש אולי בקוד זה (אצלי עובד מצויין):

        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)

        מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

        בכל נושא אפשר ליצור קשר dovid@tchumim.com

        תגובה 1 תגובה אחרונה
        0
        • M מנותק
          M מנותק
          magicode
          כתב ב נערך לאחרונה על ידי
          #4

          בגדול צריך להמיר קודם ל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)

          תגובה 1 תגובה אחרונה
          0
          • dovidD מנותק
            dovidD מנותק
            dovid ניהול
            כתב ב נערך לאחרונה על ידי
            #5

            אם לא היה מדובר בVBA, זה שורת קוד אחת בC#.

            פורסם במקור בפורום CODE613 ב01/08/2013 13:35 (+03:00)

            מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

            בכל נושא אפשר ליצור קשר dovid@tchumim.com

            תגובה 1 תגובה אחרונה
            0
            • רחמיםר מנותק
              רחמיםר מנותק
              רחמים מורחק
              כתב ב נערך לאחרונה על ידי
              #6

              איך ?

              פורסם במקור בפורום CODE613 ב01/08/2013 19:51 (+03:00)

              תגובה 1 תגובה אחרונה
              0
              • dovidD מנותק
                dovidD מנותק
                dovid ניהול
                כתב ב נערך לאחרונה על ידי
                #7

                @רחמים

                איך ?

                אחרי הוספת רפרנס לSystem.Web' קוד לC# וVB.NET כאחד:

                System.Web.HttpUtility.UrlEncode("שלום abc")
                

                פורסם במקור בפורום CODE613 ב02/08/2013 16:00 (+03:00)

                מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

                בכל נושא אפשר ליצור קשר dovid@tchumim.com

                תגובה 1 תגובה אחרונה
                0
                • M מנותק
                  M מנותק
                  magicode
                  כתב ב נערך לאחרונה על ידי
                  #8

                  @דוד ל.ט.

                  אם לא היה מדובר בVBA, זה שורת קוד אחת בC#.

                  זה לא נקרא שורה אחת ב c#.
                  זה לא קשור לשפת c# שזה נהפך לשורה אחת.
                  גם בjs זה שורה אחת בגלל שיש פונקציה כזאת שעושה את זה. וגם בphp וגם בpython וגם בvba זה יהיה שורה אחת אחרי שתעשה פונקציה כזאת.

                  אני הבאתי את האלגוריתם שעושה את זה בלי פונקציה הבאתי את זה בjs בגלל שאני על לינוקס ואני לא יכול לכתוב בvba והשפה שהכי קל לכתוב בה אוןלין זה js.

                  פורסם במקור בפורום CODE613 ב03/08/2013 23:59 (+03:00)

                  תגובה 1 תגובה אחרונה
                  0
                  • א מנותק
                    א מנותק
                    ארכיטקט
                    כתב ב נערך לאחרונה על ידי
                    #9

                    @magicode

                    @דוד ל.ט.
                    אם לא היה מדובר בVBA, זה שורת קוד אחת בC#.

                    אני הבאתי את האלגוריתם שעושה את זה בלי פונקציה הבאתי את זה בjs בגלל שאני על לינוקס ואני לא יכול לכתוב בvba והשפה שהכי קל לכתוב בה אוןלין זה js.

                    אשריך רבי אלגוריתם.........

                    פורסם במקור בפורום CODE613 ב04/08/2013 16:10 (+03:00)

                    אידיאולוגיות גדולות נכנסות למטחנה של עולם המעשה ויוצאות ממנו בפירורים (ווינסטון צ'רצ'יל, סתם סתם, זה שלי)

                    תגובה 1 תגובה אחרונה
                    0

                    בא תתחבר לדף היומי!
                    • התחברות

                    • אין לך חשבון עדיין? הרשמה

                    • התחברו או הירשמו כדי לחפש.
                    • פוסט ראשון
                      פוסט אחרון
                    0
                    • דף הבית
                    • קטגוריות
                    • פוסטים אחרונים
                    • משתמשים
                    • חיפוש
                    • חוקי הפורום