Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

cyrylica i funkcje tekstowe

141 views
Skip to first unread message

Andrzej Galikowski

unread,
Aug 6, 2008, 8:59:31 AM8/6/08
to
witajcie
pytanie lamerskie pewno ale skończyły mi się pomysły
mam w tabeli dane txt ale cyrylicą (wyświetlane poprawnie)

chciałbym przetworzyć je poprzez VBA i dostaję ?????? (ascii 63)

np z tego
StrConv(rst.Fields(1), vbFromUnicode)

lub z
Left(rst.Fields(1), 1)

ma ktoś pomysł jak to zgryźć ?
andrzej

Krzysztof Pozorek

unread,
Aug 6, 2008, 9:40:25 AM8/6/08
to
(...)

> pytanie lamerskie pewno ale skończyły mi się pomysły
> mam w tabeli dane txt ale cyrylicą (wyświetlane poprawnie)
>
> chciałbym przetworzyć je poprzez VBA i dostaję ?????? (ascii 63)

Tzn na czym to przetworzenie ma polegac?
Tekst Unicode na kazdy znak potrzebuje 2 bajtow, musisz o tym pamietac przy
przetwarzaniu.

Cyrylice mozesz wyswietlic tylko w unicode, albo zainstalowac sobie
specjalny narodowy rosyjski zestaw znakow, dostepny np w rosyjskiej wersji
Windows. Jesli usuniesz kodowanie unicode za pomoca:
StrConv(rst.Fields(1), vbFromUnicode)
to tracisz unicode i co za tym idzie cyrylice.

Takze proba wyswietlenia cyrylicy w edytorze VBA nic nie da, bo tam jej nie
ma. Edytor VBA pozwala wyswietlic tylko litery z podstawowego zestawu (i
cale szczescie, jeszcze wymysliliby jakies komendy pisane cyrylica ;-). Ale
co to Ci przeszkadza, przeciez i tak tekst wyswietlac bedziesz pewnie gdzies
na formularzu, a tam unicode jest normalnie obslugiwany nie nie ma problemu
z wpisaniem np rosyjskiego ? .

K.P.


Jacek

unread,
Aug 6, 2008, 11:36:03 AM8/6/08
to
Dnia Wed, 6 Aug 2008 15:40:25 +0200, Krzysztof Pozorek napisał(a):
> Edytor VBA pozwala wyswietlic tylko litery z podstawowego zestawu (i
> cale szczescie, jeszcze wymysliliby jakies komendy pisane cyrylica ;-).
> K.P.

Zlote slowa. Nie zapomne przejscia Excela 4, jak sie nie myle, na 5, kiedy
to zmienili (nie VBA) ale nazewnictwo formul. Czlowiek cale zycie pisal
"IF" i jak tu przejsc na "Jeżeli"? Oj ciezko bylo.
Zycie nabralo innego swiatla, mowiac poetycko;)

Andrzej Galikowski

unread,
Aug 7, 2008, 7:57:52 AM8/7/08
to

Użytkownik "Krzysztof Pozorek" <acc...@vis.pl> napisał w wiadomości
news:g7c9ka$eii$1...@news.onet.pl...

> (...)
> > pytanie lamerskie pewno ale skończyły mi się pomysły
> > mam w tabeli dane txt ale cyrylicą (wyświetlane poprawnie)
> >
> > chciałbym przetworzyć je poprzez VBA i dostaję ?????? (ascii 63)
>
> Tzn na czym to przetworzenie ma polegac?
> Tekst Unicode na kazdy znak potrzebuje 2 bajtow, musisz o tym pamietac
przy
> przetwarzaniu.
>
> Cyrylice mozesz wyswietlic tylko w unicode, albo zainstalowac sobie
> specjalny narodowy rosyjski zestaw znakow, dostepny np w rosyjskiej wersji
> Windows. Jesli usuniesz kodowanie unicode za pomoca:
> StrConv(rst.Fields(1), vbFromUnicode)
> to tracisz unicode i co za tym idzie cyrylice.

jasne :) nie zrozumieliśmy się
po co mi potrzebne ? potrzebuję funkcji która zamieni cyrylicę na zwykly
tekst
czyli np rosyjskie L na angielskie L
cos na ksztalt transkrypcji...na moj prywatny uzytek
parę tysięcy wierszy z tabeli ma być wczytane do gps jako zwykly tekst a nie
cyrylica

masz pomysl jak to zrobic ?
pozdrawiam
andrzej


BraZby

unread,
Aug 7, 2008, 2:14:35 PM8/7/08
to

Użytkownik "Andrzej Galikowski" <hi...@go2.pl> napisał w wiadomości
news:g7eo3s$1en$1...@nemesis.news.neostrada.pl...

>
> Użytkownik "Krzysztof Pozorek" <acc...@vis.pl> napisał w wiadomości
> news:g7c9ka$eii$1...@news.onet.pl...

[...]

>>
>> Cyrylice mozesz wyswietlic tylko w unicode, albo zainstalowac sobie
>> specjalny narodowy rosyjski zestaw znakow, dostepny np w rosyjskiej
>> wersji
>> Windows. Jesli usuniesz kodowanie unicode za pomoca:
>> StrConv(rst.Fields(1), vbFromUnicode)
>> to tracisz unicode i co za tym idzie cyrylice.
>
> jasne :) nie zrozumieliśmy się
> po co mi potrzebne ? potrzebuję funkcji która zamieni cyrylicę na zwykly
> tekst
> czyli np rosyjskie L na angielskie L
> cos na ksztalt transkrypcji...na moj prywatny uzytek
> parę tysięcy wierszy z tabeli ma być wczytane do gps jako zwykly tekst a
> nie
> cyrylica

Załóżmy, ze coś takiego można stworzyć, ale rodzi się pytanie
jak to zrobić programowo. Jak nauczyć program że niektóre rosyjskie
pojedyncze znaki odpowiadają czterem znakom polskim (szcz),
lub dwom (ja, ju) lub są pomijane (twardy znak),
znak zmiękczające itp. kiedy ......

Zróbmy to w najprostszy sposób.
Rozumiem, że jest to jednorazowa operacja. Jeżeli nie, to musisz
to wszystko zoptymalizować, by nie trwało to godzinami.

1. Musimy dysponować dostatecznie długim tekstem zawierającym
wszystkie znaki rosyjskie, lub takowy tekst sobie napisać.
2. Utworzyć tablicę tRusChars z polami:
tChrCode [Long], Index bez duplikatów
tRusChr [Text] długość - 1 znak
tPolChr [Text] długość - 4 znaki

Tworzymy zbiór liter z tekstu zawierającego wszystkie znaki:
'_______________________________________
Private Function zbSlowar(sTextRus As String)
Dim dbs As DAO.Database
Dim rst As DAO.Recordset
Dim sChrW As String * 1
Dim i As Long

Set dbs = CurrentDb
Set rst = dbs.OpenRecordset("tRusChars", dbOpenDynaset, dbAppendOnly)

For i = 1 To Len(sTextRus)
' pobieraj kolejne znaki z ciągu wejściowego
Mid$(sChrW, 1, 1) = Mid$(sTextRus, i, 1)
' pomiń błąd powtórzenia klucza
On Error Resume Next
If AscW(sChrW) > 255 Then
With rst
.AddNew
!tChrCode = AscW(sChrW)
!tRusChr = sChrW
.Update
End With
End If
On Error GoTo 0
Next

rst.Close
Set rst = Nothing
Set dbs = Nothing

End Function

Otwieramy tabelę i wpisujemy w pole tPolChr polskie odpowiedniki.

A teraz dokonujemy tłumaczenia tekstu:
'___________________________________________
Private Function zbPieriewiesti(sRuText As String)
Dim dbs As DAO.Database
Dim rst As DAO.Recordset
Dim sChrW As String * 1
Dim lAscW As Long
Dim i As Long
Dim sOut As String

Set dbs = CurrentDb
Set rst = dbs.OpenRecordset("tRusChars", dbOpenTable)

With rst
.Index = "tChrCode"
For i = 1 To Len(sRuText)
' pobieraj kolejne znaki z ciągu wejściowego
Mid$(sChrW, 1, 1) = Mid$(sRuText, i, 1)
lAscW = AscW(sChrW)
If lAscW > 255 Then
.Seek "=", lAscW
If .NoMatch Then
MsgBox "nie ma i tu coś musisz zrobić"
Else
sOut = sOut & Nz(!tPolChr, "-")
End If
Else
sOut = sOut & sChrW
End If
Next
End With

rst.Close
Set rst = Nothing
Set dbs = Nothing

Debug.Print sOut

End Function

Dla większej ilości rekordów rekordset rst załaduj jednorazowo, możesz
utworzyć zamiast rekordsetu kolekcję, może tablicę typu String
o indeksach od min do max tChrCode i wtedy:

sOut = sOut & (JakasTablica( lAscW))

W każdym bądź razie coś mniej więcej takiego.
Na koniec możesz podmienić w polskim "tłumaczeniu"
zbitki znaków typu (ł+miękki znak na l)
łiu - na liu, ale reguły sam musisz sam określić.


--
Pozdrowienia
BraZby

BraZby

unread,
Aug 7, 2008, 3:44:44 PM8/7/08
to

Użytkownik "BraZby" <bra...@BEZTEGOpoczta.onet.pl> napisał w wiadomości
news:g7fe24$5n0$1...@news.onet.pl...

>
> Użytkownik "Andrzej Galikowski" <hi...@go2.pl> napisał w wiadomości
> news:g7eo3s$1en$1...@nemesis.news.neostrada.pl...

[...]

>>
>> jasne :) nie zrozumieliśmy się
>> po co mi potrzebne ? potrzebuję funkcji która zamieni cyrylicę na zwykly
>> tekst
>> czyli np rosyjskie L na angielskie L
>> cos na ksztalt transkrypcji...na moj prywatny uzytek
>> parę tysięcy wierszy z tabeli ma być wczytane do gps jako zwykly tekst a
>> nie
>> cyrylica
>
> Załóżmy, ze coś takiego można stworzyć, ale rodzi się pytanie
> jak to zrobić programowo. Jak nauczyć program że niektóre rosyjskie
> pojedyncze znaki odpowiadają czterem znakom polskim (szcz),
> lub dwom (ja, ju) lub są pomijane (twardy znak),
> znak zmiękczające itp. kiedy ......
>
> Zróbmy to w najprostszy sposób.
> Rozumiem, że jest to jednorazowa operacja. Jeżeli nie, to musisz
> to wszystko zoptymalizować, by nie trwało to godzinami.

[...]

Oto próbka "tłumaczenia" z rosyjskiego na nasze
Dodałem tylko
sOut = Replace(sOut, "łi", "li", , , vbBinaryCompare)
bo to najbardziej kole w oczy:

sOut = ... w Intiernietie i opros spiecialistow pokazali, czto w
anglijskom jazykie eto ponjatiie traktuietsja nieodnoznaczno: niekotoryie
nazywaiot tak wsieh sotrudnikow IT-otrasli, a drugiie -lnie diełaja
razliczija po otrasłjam -lwsieh, kto obładaiet szirokimi poznanijami w
swoiej sfierie i zanimaietsja tworczieskoj pierierabotkoj informacii.
Wybiraja mieżdu tocznostio i kratkostio, my rieszili ostanowitsja na
"rabotnikah intiełliektuałnogo truda" ("intiełliektuałnyh rabotnikah").
Osnowa wsieh etih izmienienij porazitiełno prosta: eto potok
cifrowoj informacii. My użie liet tridcat żiwiem w informacionnuio eru, no
pokupatieli wsie ieszczie iszczut prodawcow po starinkie, poskołku osnownaja
czast obmiena informaciiej mieżdu kompanijami po-prieżniemu proishodit s
pomoszczio bumażnyh nositieliej. Da, mnogiie ispołzuiot wozmożnosti
informacionnyh tiehnołogij - no lisz dłja kontrołja za osnownymi
opieracijami: uprawlieniiem proizwodstwiennymi sistiemami, sostawlieniiem
sczietow, wiedieniiem buhgałtierskogo uczieta i rasczieta nałogow. Wsie
eto - nie bolieie cziem awtomatizacija staryh prociessow. .....

Jak dla mnie taki "spolszczony" tekst łatwiej sie czyta, niż ten oryginalny
pisany bukwami.


--
Pozdrowienia
BraZby


Grzegorz Danowski

unread,
Aug 7, 2008, 4:07:19 PM8/7/08
to
Użytkownik "BraZby" <bra...@BEZTEGOpoczta.onet.pl> napisał w wiadomości
news:g7fjb5$l05$1...@news.onet.pl...

> Oto próbka "tłumaczenia" z rosyjskiego na nasze
...

> sOut = ... w Intiernietie i opros spiecialistow pokazali, czto w
> anglijskom jazykie eto ponjatiie traktuietsja nieodnoznaczno: niekotoryie
> nazywaiot tak wsieh sotrudnikow IT-otrasli, a drugiie -lnie diełaja
> razliczija po otrasłjam -lwsieh, kto obładaiet szirokimi poznanijami w
> swoiej sfierie i zanimaietsja tworczieskoj pierierabotkoj informacii.
> Wybiraja mieżdu tocznostio i kratkostio, my rieszili ostanowitsja na
> "rabotnikah intiełliektuałnogo truda" ("intiełliektuałnyh rabotnikah").

Mnie by jakoś bardziej pasowało "ch" a nie "h".

> Jak dla mnie taki "spolszczony" tekst łatwiej sie czyta, niż ten
> oryginalny
> pisany bukwami.

Mnie też.
G.

Andrzej Galikowski

unread,
Aug 8, 2008, 5:36:50 AM8/8/08
to
>
> End Function
>
> Dla większej ilości rekordów rekordset rst załaduj jednorazowo, możesz
> utworzyć zamiast rekordsetu kolekcję, może tablicę typu String
> o indeksach od min do max tChrCode i wtedy:
>
> sOut = sOut & (JakasTablica( lAscW))
>
> W każdym bądź razie coś mniej więcej takiego.
> Na koniec możesz podmienić w polskim "tłumaczeniu"
> zbitki znaków typu (ł+miękki znak na l)
> łiu - na liu, ale reguły sam musisz sam określić.
>
>
> --
> Pozdrowienia
> BraZby
>

dokładnie o to chodziło :)
wielkie dzięki
"czytelność" takiego tekstu jest troche lepsza, to fakt
dzięki Twojemu kodowi odkryłem AscW, i tego było mi brak, używałem Asc i w
odpowiedzi dostawałem 63

myślałem o użyciu select case w funkcji do zmiany liter
a potem znak po znaku
wielkie dzięki jeszcze raz
pozdr
a.


0 new messages