Konverze mezi kódovými stránkami   zodpovězená otázka

VB.NET, .NET

Ahoj mám takový problém, v vb6 jsem pracoval na jednom projektu, který přejímal data ze staré dosovské aplikace, aměl jsem následující kod pro převod do windows - jedná se mi jen o převod znakových sad

Enum CodeTab
  LATIN2 = 0
  Windows = 1
  Kamenicky = 2
  BezDiakritiky = 3
End Enum

Public Function PrevodKodovani(S As String, From_tab As CodeTab, To_tab As CodeTab) As String
  Const cLATIN2 As String = "a µe‚Ř·iˇÖo˘ŕuŁé…Ţyěí|cź¬dÔŇl–•nĺŐrýüsçćtś›z§¦|„‰”ŽÓ™šá"
  Const cWIN_CS As String = "aáÁeéÉěĚiíÍoóÓuúÚůŮyýÝ|cčČdďĎlľĽnňŇrřŘsšŠtťŤzžŽ|äëöüÄËÖÜß"
  Const cKAMENI As String = "a Źe‚ˆ‰iˇ‹o˘•uŁ—–¦y˜ť|c‡€dƒ…lŚśn¤Ąr©žs¨›tź†z‘’|„‰”ŽÓ™šá"
  Const cBEZDIA As String = "aaAeeEeEiiIooOuuUuUyyY|ccCddDllLnnNrrRssSttTzzZ|aeouAEOUá"

  Dim i#
  Dim NewS$
  Dim p#
  NewS = S
  
  Dim SelectTable As CodeTab
  Dim FromTable As String, ToTable As String, tmpTable As String
  
  ''From
  SelectTable = From_tab
  GoSub SelectTable
  FromTable = tmpTable
  ''To
  SelectTable = To_tab
  GoSub SelectTable
  ToTable = tmpTable
 
  For i = 1 To Len(S)
    p = InStr(FromTable, Mid(S, i, 1))
    If p <> 0 Then     'nalen znak?
      Mid(NewS, i, 1) = Mid(ToTable, p, 1)  'zamenit znak
    End If
  Next 'i
  PrevodKodovani = NewS
  
Exit Function

SelectTable:
  Select Case SelectTable
    Case LATIN2
      tmpTable = cLATIN2
    Case Windows
      tmpTable = cWIN_CS
    Case Kamenicky
      tmpTable = cKAMENI
    Case BezDiakritiky
      tmpTable = cBEZDIA
    Case Else
      Debug.Assert False
  End Select

  Return
End Function

no a zákazník se v poslední chvíli rozhodl že ne vb6 ale vb.NET a mne se nedaří narychlo vymyslet něco podobného, původní kod nechodí, v řetězcích jazyka to hlasí neznámé znaky.

Prosím o radu, jak na to

Děkuji

nahlásit spamnahlásit spam 0 odpovědětodpovědět

.NET Framework funkce pro převod kódování češtiny obsahuje a určitě bude umět i tato prehistorická kódování.

Obecně se to dá převést takto:

Dim kodovani As System.Text.Encoding = System.Text.Encoding.GetEncoding("název kódování")
Dim vystup As String = kodovani.GetString(System.Text.Encoding.ASCII.GetBytes(puvodniText))

Jaké kódování předat funkci GetEncoding najdete na následující stránce: http://msdn.microsoft.com/en-us/library/... .

A mimochodem zkuste se zbavit toho GoSub, to by se nemělo používat ani ve VB6, to je přežitek ještě ze starých basiců, které neměly procedury.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Diky za odpověď, dostal jsem se k tomu až dnes, ale vše funguje, jen stránku LATIN2 nemohu v kodování nálezt, mohu ještě požádat o radu

Děkuji

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Zkoušel jste ISO 8859-2 (jiný název pro Latin2)?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Ano ale bohužel to nezabralo, ještě to prověřím ale jsem si skoro jistý, že to nedávalo správný výsledek

Děkuji

nahlásit spamnahlásit spam 0 odpovědětodpovědět

zkuste ještě ISO 8859-1

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Zkuste:

Dim kodovani As System.Text.Encoding = System.Text.Encoding.GetEncoding(852)
Dim vystup As String = kodovani.GetString(System.Text.Encoding.DEFAULT.GetBytes(puvodniText))
 

Jak jste dokázal cp895 - Kameničtí - tu MS podporoval jen ve FoxPro?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Všem děkuji za pomoc, ale bohužel mi žadná rada nepomohla, dokonce jsem zkusil tu funkci ve vb6 dat do samostatne knihovny ve vb6 a vlozit do projektu a vysledek stejny.

Pokud bych mohl někoho ještě požádat o pomoc poslal bych mu ten textový souborek se zdrojem a snad by to bylo jasnější, díky moc předem za pomoc.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Když soubor někam dáte ke stažení, podívám se na to.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Všem dík za rady a pomoc už jsem to zlomil, problem byl v tom, že jsem jako zdroj dal code page 852 což je správně ale jako cíl jsem dával W +ěřé což byla chyba až jsem použil jako cíl unicode vše proběhlo ok. Velká pomoc se našla codeprojectu.

Ještě jednou dík.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

A cíl default jste nezkusil?

Jak jste dokázal cp895 - Kameničtí - tu MS podporoval jen ve FoxPro?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

To já ne ale zákazník měl data v textových souborech a původní program byl psám v prologu o tom vím jen že to byl programovací jazyk, ale jak tam dostali tu původní stránku netuším, já jsem zdroják nedostal a jen jsem řešil práci s původními soubory pod windows a v dotnetu.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Myslím, jak jste ve VB.NET dokázal převést kódování Kamenických, které MS ve Visual .NET nepodporuje (jako kódovou stránku kód Kamenických zná z programů MS jen FoxPro)

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback