• Vui lòng đọc nội qui diễn đàn để tránh bị xóa bài viết
  • Tìm kiếm trước khi đặt câu hỏi

Đổi Romaji (ANSI) -> Hiragana và Katakana (UNICODE)

Các thủ thuật liên quan đến xử lý chuỗi và thời gian
Hình đại diện của người dùng
vie87vn
Thành viên tích cực
Thành viên tích cực
Bài viết: 150
Ngày tham gia: T.Bảy 05/04/2008 10:15 am
Đến từ: Quán Đôi - Củ Chi
Been thanked: 2 time
Liên hệ:

Đổi Romaji (ANSI) -> Hiragana và Katakana (UNICODE)

Gửi bàigửi bởi vie87vn » T.Ba 17/02/2009 10:15 am

Thủ thuật: Đổi chuỗi Romaji sang chuỗi Hiragana và Katakana trong tiếng Nhật
Tác giả: vie87vn
Yêu cầu: Để chạy bản Demo này, yêu cầu cần control iVB Unicontrol 2.0 của diễn đàn.
Mô tả: Đỗi chuỗi Romaji (ANSI) sang chuỗi Hiragana và Katakana (Unicode) trong tiếng Nhật


Mã: Chọn hết

  1. Public Function ToNihonGo(sRomajiInput As String) As String
  2.     'Please do not remove these lines
  3.     'ToNihonGo Function: Converting Romaji string to Hiragana or Katakana string
  4.     'Author: vie87vn - Email: vie87vn@yahoo.com; vie87vn@gmail.com; vie87vn@zing.vn
  5.     'From: http://www.caulacbovb.com
  6.     'How to use: ToNihonGo("Nihongo") -> にほんご
  7.    
  8.     Dim sRomaji As String, sTmp As String, sTmpArry() As String
  9.     Dim sHiragana As String, sHiraganaArr() As String
  10.     Dim iIsKatakana As Integer, iPlus As Integer, iC As Integer
  11.     Dim I As Long, j As Long, k As Long, lPos As Long
  12.     Dim sArr() As String, sRomajiTmp As String, sNoKatakana As String
  13.    
  14.     If Len(sRomajiInput) = 0 Then ToNihonGo = "": Exit Function
  15.    
  16.     iIsKatakana = 0
  17.     iPlus = 0
  18.     sTmp = ""
  19.     sRomajiTmp = sRomajiInput
  20.    
  21.     'Chuyen doi A?o A^m
  22.     Dim sTsu As String, sConv As String, sArrTsu() As String, sArrConv() As String
  23.     sTsu = "tta,cchi,ttsu,ttu,tte,tto,ssa,ssi,sshi,ssu,sse,sso,ppa,ppi,ppu,ppe,ppo,kka,kki,kku,kke,kko,zza,zzi,zzu,zze,zzo,jja,jji,jju,jje,jjo,kkya,kkyi,kkyu,kkye,kkyo,zzya,zzyi,zzyu,zzye,zzyo,jjya,jjyi,jjyu,jjye,jjyo,ppya,ppyi,ppyu,ppye,ppyo,ssya,ssyi,ssye,ssyu,ssyo"
  24.     sConv = "ltuta,ltuchi,ltutsu,ltutu,ltute,ltuto,ltusa,ltusi,ltushi,ltusu,ltuse,ltuso,ltupa,ltupi,ltupu,ltupe,ltupo,ltuka,ltuki,ltuku,ltuke,ltuko,ltuza,ltuzi,ltuzu,ltuze,ltuzo,ltuja,ltuji,ltuju,ltuje,ltujo,ltukya,ltukyi,ltukyu,ltukye,ltukyo,ltuzya,ltuzyi,ltuzyu,ltuzye,ltuzyo,ltujya,ltujyi,ltujyu,ltujye,ltujyo,ltupya,ltupyi,ltupyu,ltupye,ltupyo,ltusya,ltusyi,ltusyu,ltusye,ltusyo"
  25.     sArrTsu = Split(sTsu, ",")
  26.     sArrConv = Split(sConv, ",")
  27.     For I = 0 To UBound(sArrTsu)
  28.         sRomajiTmp = Replace(sRomajiTmp, sArrTsu(I), sArrConv(I))
  29.     Next I
  30.    
  31.     'Ca'c ky tu khong bien doi thanh Katakana
  32.     sNoKatakana = "&H3000|&H3001|&H3002|&H3008|&H3009|&H300A|&H300C|&H300D"
  33.    
  34.     'Da^'u PHAY & dau "-" la` da^'u dac biet, phai chuyen doi rieng
  35.     sRomajiTmp = Replace(sRomajiTmp, ",", ChrW(255))
  36.     sRomajiTmp = Replace(sRomajiTmp, "--", ChrW(&H30FC))
  37.    
  38.     'Doi Romaji sang Hiragana hoac Katakana
  39.     sRomaji = " ," & ChrW(255) & ",.,<,>,(,)," & Chr(34) & ",[,],a,i,u,e,o,ka|ca,ki|ci,ku|cu|qu,ke|ce,ko|co,ha,hi,fu|hu,he,ho,sa,si|shi,su,se,so," & _
  40.               "na,ni,nu,ne,no,ta,chi|ti,tsu|tu,te,to,ma,mi,mu,me,mo,ra,ri,ru,re,ro," & _
  41.               "ya,yi,yu,ye,yo,wa,wi|qyi,wu,we|qye,wo,ga,gi,gu,ge,go," & _
  42.               "za,zi|ji,zu,ze,zo,da,di,du,de,do,ba,bi,bu,be,bo,pa,pi,pu,pe,po," & _
  43.               "zya|jya|ja,zyi|jyi,zyu|jyu|ju,zye|jye|je,zyo|jyo|jo," & _
  44.               "cha|tya|cya,tyi|cyi,chu|tyu|cyu,che|tye|cye,cho|tyo|cyo," & _
  45.               "fa,fi,fe,fo,qa,qi,qe,qo," & _
  46.               "kya,kyi,kyu,kye,kyo,gya,gyi,gyu,gye,gyo," & _
  47.               "sha|sya,syi,shu|syu,she|sye,sho|syo," & _
  48.               "hya,hyi,hyu,hye,hyo,bya,byi,byu,bye,byo,pya,pyi,pyu,pye,pyo," & _
  49.               "mya,myi,myu,mye,myo,rya,ryi,ryu,rye,ryo,nya,nyi,nyu,nye,nyo," & _
  50.               "la|xa,li|xi|lyi|xyi,lu|xu,le|xe|lye|xye,lo|xo,ltu|xtu|ltsu,lya|xya,lyu|xyu,lyo|xyo," & _
  51.               "dya,dyi,dyu,dye,dyo,va,vi,vu,ve,vo,vya,vyi,vyu,vye,vyo," & _
  52.               "fya,fyi,fyu,fye,fyo,qya,qyu,qyo,\n"
  53.  
  54.     'Hex ASCII cua Katakana = Hex ASCII cua Hiragana + &H60 (= Decimal 96)
  55.     sHiragana = "3000,3001,3002,3008,3009,FF08,FF09,300A,300C,300D,3042,3044,3046,3048,304A,304B,304D,304F,3051,3053,306F,3072,3075,3078,307B,3055,3057,3059,305B,305D," & _
  56.                 "306A,306B,306C,306D,306E,305F,3061,3064,3066,3068,307E,307F,3080,3081,3082,3089,308A,308B,308C,308D," & _
  57.                 "3084,3044,3086,3044|3047,3088,308F,3046|3043,3046,3046|3047,3092,304C,304E,3050,3052,3054," & _
  58.                 "3056,3058,305A,305C,305E,3060,3062,3065,3067,3069,3070,3073,3076,3079,307C,3071,3074,3077,307A,307D," & _
  59.                 "3058|3083,3058|3043,3058|3085,3058|3047,3058|3087," & _
  60.                 "3061|3083,3061|3043,3061|3085,3061|3047,3061|3087," & _
  61.                 "3075|3041,3075|3043,3075|3047,3075|3049,304F|3041,304F|3043,304F|3047,304F|3049," & _
  62.                 "304D|3083,304D|3043,304D|3085,304D|3047,304D|3087,304E|3083,304E|3043,304E|3085,304E|3047,304E|3087," & _
  63.                 "3057|3083,3057|3043,3057|3085,3057|3047,3057|3087," & _
  64.                 "3072|3083,3072|3043,3072|3085,3072|3047,3072|3087,3073|3083,3073|3043,3073|3085,3073|3047,3073|3087,3074|3083,3074|3043,3074|3085,3074|3047,3074|3087," & _
  65.                 "307F|3083,307F|3043,307F|3085,307F|3047,307F|3087,308A|3083,308A|3043,308A|3085,308A|3047,308A|3087,306B|3083,306B|3043,306B|3085,306B|3047,306B|3087," & _
  66.                 "3041,3043,3045,3047,3049,3063,3083,3085,3087," & _
  67.                 "3062|3083,3062|3044,3062|3085,3062|3048,3062|3087,30F4|3041,30F4|3043,30F4,30F4|3047,30F4|3049,30F4|3083,30F4|3043,30F4|3085,30F4|3047,30F4|3087," & _
  68.                 "3075|3083,3075|3043,3075|3085,3075|3047,3075|3087,304F|3083,304F|3085,304F|3087,3093"
  69.    
  70.     sArr = Split(sHiragana, ",")
  71.    
  72.     For I = 1 To Len(sRomajiTmp)
  73.         If Mid(sRomajiTmp, I, 1) = "-" Then: iIsKatakana = IIf(iIsKatakana = 0, 1, 0): iPlus = 1: Else: iPlus = 0
  74.         k = 4
  75.         While k > 0
  76.             If k = 1 Or Len(Mid(sRomajiTmp, I + iPlus, k)) = 1 Then
  77.                 lPos = InStr(1, Left(sRomaji, 29), Mid(sRomajiTmp, I + iPlus, k), vbTextCompare)
  78.             Else
  79.                 lPos = InStr(1, sRomaji, Mid(sRomajiTmp, I + iPlus, k), vbTextCompare)
  80.             End If
  81.             If lPos > 0 Then
  82.                 sTmpArry = Split(Left(sRomaji, lPos), ",")
  83.                 If InStr(1, sArr(UBound(sTmpArry)), "|", vbTextCompare) > 0 Then
  84.                     sHiraganaArr = Split(sArr(UBound(sTmpArry)), "|")
  85.                     sTmp = sTmp & ChrW(Val("&H" & sHiraganaArr(0)) + IIf(iIsKatakana = 0, &H0, IIf("&H" & sHiraganaArr(0) = "&H3000", &H0, &H60)))
  86.                     sTmp = sTmp & ChrW(Val("&H" & sHiraganaArr(1)) + IIf(iIsKatakana = 0, &H0, IIf("&H" & sHiraganaArr(1) = "&H3000", &H0, &H60)))
  87.                 Else
  88.                     sTmp = sTmp & ChrW(Val("&H" & sArr(UBound(sTmpArry))) + IIf(iIsKatakana = 0, &H0, IIf(InStr(1, sNoKatakana, "&H" & sArr(UBound(sTmpArry)), vbTextCompare) > 0, &H0, &H60)))
  89.                 End If
  90.                 I = I + k - 1 + iPlus: k = 0
  91.             Else
  92.                 If k = 1 Then
  93.                     'Xu ly ky tu khong co' trong tieng Nhat
  94.                     sTmp = sTmp & Mid(sRomajiTmp, I, 1)
  95.                     'Xu ly ky tu 'n' hop le: Su dung Penkyoshimasu, khong can: Pe\nkyoshimasu
  96.                     'Xu ly ky tu 'm' hop le: Su dung sempai, tempura thay vì se\mpai, te\mpura
  97.                     'Luu y: ky tu 'n' & 'm' trong Romaji deu nhu nhau trong tieng Nhat.
  98.                     Dim bIsN As Boolean, bIsHiragana As Boolean, bIsMore1 As Boolean
  99.                     bIsN = (UCase(Right(sTmp, 1)) = "N") or (UCase(Right(sTmp, 1)) = "M")
  100.                     bIsMore1 = (Len(sTmp) > 1)
  101.                     If bIsMore1 Then
  102.                         Dim sMidTmp As String, iKata As Integer
  103.                         iKata = IIf(iIsKatakana = 0, 0, 96)
  104.                         sMidTmp = Left(Hex(AscW(Mid(sTmp, Len(sTmp) - 1, 1)) - iKata) & "|||", 4)
  105.                         bIsHiragana = (InStr(1, Mid(sHiragana, 50, Len(sHiragana) - 55), sMidTmp) > 0)
  106.                     End If
  107.                     If bIsN And bIsHiragana And bIsMore1 Then sTmp = Left(sTmp, Len(sTmp) - 1) & ChrW(&H3093 + IIf(iIsKatakana = 0, &H0, &H60))
  108.                 End If
  109.                 k = k - 1
  110.             End If
  111.         Wend
  112.     Next I
  113.    
  114.     'Dau ngoac kep
  115.     For I = 1 To Len(sTmp)
  116.         If AscW(Mid(sTmp, I, 1)) = &H300A Then
  117.             iC = iC + 1
  118.             If iC Mod 2 = 0 Then sTmp = Left(sTmp, I - 1) & ChrW(&H300B) & Mid(sTmp, I + 1)
  119.         End If
  120.     Next I
  121.    
  122.     'Doi ca'c da^'u dac biet khac: dupe 2 ky' tu se~ chuyen doi la.i thanh dau' binh thuong
  123.     'Dim sEMark As String, sJMark As String, sArrEMark() As String, sArrJMark() As String
  124.     'sJMark = "30003001300230083009300C300D"
  125.     'sEMark = " ,.<>[]"
  126.     'For i = 1 To Len(sJMark) Step 4
  127.     '    sTmp = Replace(sTmp, ChrW("&H" & Mid(sJMark, i, 4)) & ChrW("&H" & Mid(sJMark, i, 4)), Mid(sEMark, i \ 4 + 1, 1))
  128.     'Next i
  129.    
  130.     ToNihonGo = sTmp
  131. End Function
  132.  


Tha hồ mà xem các chữ Yamaha, Suzuki, Toyota, Ajinomoto, Sukura bằng tiếng Nhật ra sao nhe.

Code mình đã cố gắng làm cho ngắn lắm rồi. Nhưng bạn nào có sáng kiến tối ưu code thì post lên đây nhe.
Tập tin đính kèm
ToNihongo.rar
Module hàm ToNihonGo
(130.91 KiB) Đã tải 1112 lần
ToNihonGo Sample.jpg
Hình minh họa
Sửa lần cuối bởi vie87vn vào ngày CN 26/07/2009 8:29 am với 2 lần sửa.


Hoàng Sa và Trường Sa là của Việt Nam.

Hình đại diện của người dùng
hdn
Thành viên tâm huyết
Thành viên tâm huyết
Bài viết: 319
Ngày tham gia: T.Tư 26/03/2008 7:09 pm
Has thanked: 1 time
Been thanked: 4 time

Re: Đổi Romaji (ANSI) -> Hiragana và Katakana (UNICODE)

Gửi bàigửi bởi hdn » T.Năm 23/07/2009 11:13 am

tiếng nhật có 2 kiểu chữ là Kanji (Hán tự) và Kana, kiểu Kana bao gồm Hiragana và Katakana
mỗi kiểu chữ có nhưng ưu nhược điểm riêng đc dùng tùy theo từng trường hợp, Hiragana là loại đc dùng phổ biến nhất
Hiragana dùng cho các từ thuần-Nhật, còn Katakana thì dùng cho các từ ngoại lai, tên người nước ngoài
ví dụ: Smith - tên tiếng Anh, ra tiếng Nhật là simisi khi đó phải dùng chữ katakana, viết là シミシ
Hồ Chí Minh -> Hochimin -> ホチミン (katakana)
Vitamin -> Bitamin -> ビタミン (katakana)
dùng Hiragana thì
thức ăn -> meshi -> めし
có những từ viết đc cả kanji lẫn hiragana như
Hentai -> biến thái -> へんたい (hiragana) hoặc 変態 (kanji) >:)
Romaji là kiểu chữ phiên âm, một số người vẫn chưa chấp nhận kiểu chữ này nhưng đa phần người mới học ưa dùng kiểu chữ này hơn là chữ Kana hoặc Kanji vì nó viết theo tiếng Latin, ai cũng có thể đọc.
-------
ko ngờ đào mộ cái topic cổ xưa này lên mà đc nhiều người quan tâm thế >:)
:|

Hình đại diện của người dùng
vie87vn
Thành viên tích cực
Thành viên tích cực
Bài viết: 150
Ngày tham gia: T.Bảy 05/04/2008 10:15 am
Đến từ: Quán Đôi - Củ Chi
Been thanked: 2 time
Liên hệ:

Re: Đổi Romaji (ANSI) -> Hiragana và Katakana (UNICODE)

Gửi bàigửi bởi vie87vn » CN 26/07/2009 8:22 am

Hihi, không ngờ hdn pro tiếng Nhật đến thế. Và cám ơn mấy bạn quan tâm cái module này. Mình thấy phiên âm Romaji tiếng Nhật dễ chuyển đổi nên có ý tưởng làm ra và để dành cho khi nào lên net, lười chỉnh bộ gõ thì dùng cái này xài cho nó nhanh. Còn có ý định phát triển cái module Kanji nữa, nhưng theo dạng từ điển, chưa tìm ra giải pháp, ai có kinh nghiệm làm từ điển thì ... pm nhá. Cũng như bộ gõ Kanji của Windows thôi, nó cũng dùng từ điển ^^! + 1 bộ gõ có thể nhúng trực tiếp trong textbox như bộ gõ tiếng Việt có trên diễn đàn.

Romaji là kiểu chữ phiên âm, một số người vẫn chưa chấp nhận kiểu chữ này nhưng đa phần người mới học ưa dùng kiểu chữ này hơn là chữ Kana hoặc Kanji vì nó viết theo tiếng Latin, ai cũng có thể đọc.

Chỉ có người Việt Nam mình "pro" xài cái này thôi, tại nó na ná giống tiếng Việt mình và tới tận bi giờ, 1 số MC trên truyền hình còn phiên âm Suzuki thay vì chính xác là Sưzưki, nản. [-(

Hdn có vẻ quan tâm tiếng Nhật, có gì trao đổi trên này, xem ra có vẻ vui haha. :-*

Hentai -> biến thái -> へんたい

Pác mà lên mí diễn đàn manga anime mà phất biểu kiểu này, chắc nó chém pác không thương tiếc. :))

Và ̀私は ワン です。

Và tiện, mấy pác lôi mấy cái này lên dùm em viewtopic.php?f=27&t=5821
----
Àh quên, trong code mình ghi thiếu 1 thứ, mấy bạn bổ sung lại nhá, là việc Romaji dùng 'm' như 'n'. Cái này trong manga chuyên gia xài ;)
Tìm

Mã: Chọn hết

  1. bIsN = (UCase(Right(sTmp, 1)) = "N")

Sửa

Mã: Chọn hết

  1. bIsN = (UCase(Right(sTmp, 1)) = "N") or (UCase(Right(sTmp, 1)) = "M")
Hoàng Sa và Trường Sa là của Việt Nam.

Hình đại diện của người dùng
hdn
Thành viên tâm huyết
Thành viên tâm huyết
Bài viết: 319
Ngày tham gia: T.Tư 26/03/2008 7:09 pm
Has thanked: 1 time
Been thanked: 4 time

Re: Đổi Romaji (ANSI) -> Hiragana và Katakana (UNICODE)

Gửi bàigửi bởi hdn » CN 26/07/2009 7:06 pm

Chém thử phát
Hirakey
bộ gõ chữ Hiragana
Mã nguồn và thuật toán: tienlbhoc
Độ source + thêm bảng chữ: hdn :D
Hirakey.rar
(14.89 KiB) Đã tải 459 lần
:|

Hình đại diện của người dùng
vie87vn
Thành viên tích cực
Thành viên tích cực
Bài viết: 150
Ngày tham gia: T.Bảy 05/04/2008 10:15 am
Đến từ: Quán Đôi - Củ Chi
Been thanked: 2 time
Liên hệ:

Re: Đổi Romaji (ANSI) -> Hiragana và Katakana (UNICODE)

Gửi bàigửi bởi vie87vn » T.Sáu 31/07/2009 6:15 pm

ac, không biết mấy bộ gõ pác làm ra theo kịp người ta hok nữa. Người ta dùng MFC, thì cái thư viện hook của nó cũng chính tác giả viết ra, còn mình, dựa dẫm hơi nhiều T_T. Với lại, Unikey ng ta là 1 bậc tiền bối rồi.
Trên diễn đàn mình có 1 bác có hướng dẫn nhưng đã ngưng nửa chừng và pót cả source VbKey nhưng.... pót theo module, có đọc cũng chả hiểu. Nhất là vấn đề về Clipboard và bufer, con số 0 to tướng, hook thì càng không. Dù có biết thì không biết cách nào khắc phục về vấn đề Unhook, cứ ngắt chương trình ngang mãi. Pó chi. Có thì pác cứ Showhand source code lên em xem :D, dùng replace là sao? Bộ gõ là... mù tịt hehe
Hoàng Sa và Trường Sa là của Việt Nam.

tienlbhoc
Thành viên tâm huyết
Thành viên tâm huyết
Bài viết: 415
Ngày tham gia: T.Bảy 14/07/2007 10:06 pm
Đến từ: Hà Nội
Been thanked: 1 time

Re: Đổi Romaji (ANSI) -> Hiragana và Katakana (UNICODE)

Gửi bàigửi bởi tienlbhoc » T.Sáu 31/07/2009 8:44 pm

Đọc cái này xem có vỡ ra tí gì không :

down cái file hirakey của hdn soạn nội dung file hiragana.hdn mới có nội dung như sau :
aa->â
aw->ă

Dấu -> là hiển thị của ký tự tab đó

Sau đó bật hirakey lên xem nó gõ chữ aa có sang chữ â hay không nhé .
Nguyên tắc thuật toán này đơn giản chỉ có vậy , kiểm tra ký tự người dùng gõ trong từ điển định nghĩa , gặp từ nào trùng thì thay thế tương ứng . Có thể mở rộng ra sau này để gõ dấu ở cuối câu :
angs->áng
anhs->ánh

Cứ tổ hợp thôi , tất nhiên không thể sửa dấu nhanh và uyển chuyển như dùng thuật toán chuyên dụng , nhưng vì nguyên tắc làm bộ gõ quá dễ , thậm chí ngay trong 1 buổi tối , tớ có thể trang bị toàn bộ các ngôn ngữ gõ mà vietkey hỗ trợ như : Đức , pháp , nga ....
Diễn đàn và blog phần mềm tự làm :
http://my.opera.com/DienDanTienlbhoc/forums/
http://my.opera.com/tienlbhoc/blog/


Quay về “[VB] Chuỗi và Thời gian”

Đang trực tuyến

Đang xem chuyên mục này: Không có thành viên nào trực tuyến.0 khách