UTF-8 byte részhalmaza

UTF-8 byte részhalmaza
2009-01-13T13:34:43+01:00
2009-01-14T19:00:57+01:00
2022-11-12T05:00:38+01:00
tervin
Sziasztok!
Volna megint egy kérdésem:
Szeretnék egy fájlt beolvasni, majd konvertálni UTF-8-ba, azt számokká alakítani és annak egy részhalmazát venni!

Íme a kód:

if (LoadDlg.ShowDialog() == DialogResult.OK)
{
string filename = LoadDlg.FileName;
StreamReader sr = new StreamReader(filename, Encoding.UTF8, true);
tbxText.Text = sr.ReadToEnd().ToString();
sr.Close();

string text = tbxText.Text;

Encoding enc = Encoding.Default; //ANSI
Encoding utf8 = Encoding.UTF8;
Encoding unicode = Encoding.Unicode;
Encoding utf32 = Encoding.UTF32;
Encoding utf7 = Encoding.UTF7;

byte[] buffer = new byte[5];

FileStream file = new FileStream(filename, FileMode.Open);
file.Read(buffer, 0, 5);
file.Close();

if (buffer[0] == 0xef && buffer[1] == 0xbb && buffer[2] == 0xbf)
{
enc = Encoding.UTF8;
}
else if (buffer[0] == 0xfe && buffer[1] == 0xff)
{
enc = Encoding.Unicode;
byte[] unicodeBytes = unicode.GetBytes(text);
byte[] utf8Bytes = Encoding.Convert(enc, utf8, unicodeBytes);
}
else if (buffer[0] == 0 && buffer[1] == 0 && buffer[2] == 0xfe && buffer[3] == 0xff)
{
enc = Encoding.UTF32;
byte[] utf32Bytes = utf32.GetBytes(text);
byte[] utf8Bytes = Encoding.Convert(enc, utf8, utf32Bytes);
}
else if (buffer[0] == 0x2b && buffer[1] == 0x2f && buffer[2] == 0x76)
{
enc = Encoding.UTF7;
byte[] utf7Bytes = utf7.GetBytes(text);
byte[] utf8Bytes = Encoding.Convert(enc, utf8, utf7Bytes);
}
}

Eza kód kb. felismeri, hogy milyen kódkészletű szöveget töltöttem be, átkonvertáltam UTF-8-ba és a karaktereket elméletileg egy ilyen byte tömbbe gyűjtötte.

A kérdésem az volna, hogyan lehet ezeknek egy részhalmazát lekérni?
pl:
if (x == 1) //magyar nyelv
{
if (utf8Bytes > 0x0255)
{
MessageBox.Show("Cirill betűket nem töltök be");
}
}
if (x == 2) //angol
{
if (utf8Bytes > 0x255)
MessageBox.Show("Cirill betűket nem töltök be");
}
}
if (x == 3) //bolgár
{
if (utf8Bytes < 0x255)
MessageBox.Show("Latin betűket nem töltök be");
}
}

Ez persze így nem jó!! De valami ilyesmit, hogyan lehet megcsinálni?

Előre is köszi a segítséget!
Mutasd a teljes hozzászólást!
Rosszul állsz hozzá az egészhez, mivel az utf8-as karakterek kétbájtos char típusúak. Ezeknél van értelme a char (és nem byte) tömb bejárásának, pl. ilyen módon:
if (x == 1) //magyar nyelv { foreach (char c in utf8Chars) if (c > 0x0255) MessageBox.Show("Cirill betűket nem töltök be"); }

Egyébként miért használsz saját BOM-detektáló feltételeket, mikor a StreamReader már tartalmazza azt?
StreamReader sr = new StreamReader(@"c:\textfile.txt", Encoding.UTF8, true); fileEncoding = sr.CurrentEncoding;
Mutasd a teljes hozzászólást!

  • Köszi a segítséget! Nem is tudom, hol tartanék nélküled!

    Észre se vettem hogy van CurrentEncoding :)
    Még lenne aért egy nagyon minimál, de engem bosszantó problémám.Lentebb leírom.
    Íme a helyes út:

    if (LoadDlg.ShowDialog() == DialogResult.OK)
    {
    string filename = LoadDlg.FileName;
    string text = tbxText.Text;

    StreamReader sr = new StreamReader(filename, Encoding.UTF8, true);
    Encoding fileEncoding = sr.CurrentEncoding;
    text = sr.ReadToEnd().ToString();
    sr.Close();

    byte[] buffer = new byte[5];

    FileStream file = new FileStream(filename, FileMode.Open);
    file.Read(buffer, 0, 5);
    file.Close();

    byte[] codeBytes = fileEncoding.GetBytes(text);
    byte[] utf8Bytes = Encoding.Convert(fileEncoding, Encoding.UTF8, codeBytes);

    char[] utf8Chars = Encoding.UTF8.GetChars(utf8Bytes);
    MessageBox.Show(utf8Chars.Length.ToString());
    int loadchar = 0;
    int i = 0;

    if (x == 2) //angol nyelv
    {
    foreach (char c in utf8Chars)
    {
    i++;
    if (c > 127)
    {
    loadchar++;
    if ((loadchar >= (utf8Chars.Length / 2)) && (i > utf8Chars.Length))
    {
    MessageBox.Show("It is not possible to fill the file, too much the invalid character!", "Error!", MessageBoxButtons.OK, MessageBoxIcon.Stop);
    }
    else
    {
    utf8Chars[i - 1] = ' ';
    }
    }
    }
    string englishtext = new string(utf8Chars);
    tbxText.Text = englishtext;
    }
    }
    }

    Na ez elméletileg megnézi, hogy a szövegben van-e az angol betűkön kívül más is, ha a szöveg keveseb mint felében van, akkor azt "kiszpészezi" (white character), ha nem akkor kiír egy MessageBoxotés mindent kiszpészez. A kérdésem már csak annyi volna, hogyha ilyen hibaüzenetet küld, hogy lehet az egész textboxot üressé tenni:
    tbxText.Text = ""; - itt ez nem segít, meg a hasonló műveletek sem...

    Előre is köszi!!!

    Mutasd a teljes hozzászólást!
  • a TextBox Clear() függvénye sem működik?
    Mutasd a teljes hozzászólást!
  • Rájöttem, hogy hol a hiba!
    Hiába törlöm a textboxot, alul megadom, hogy a white karaktereket írja ki!

    Így inkább létrehoztam mégegy változót: bool tt;
    és így már jó:

    if (x == 2) //angol nyelv
    {
    foreach (char c in utf8Chars)
    {
    i++;
    if (!(c < 191))
    {
    loadchar++;
    if ((loadchar >= (utf8Chars.Length / 2)) && (i == utf8Chars.Length))
    {
    MessageBox.Show("It is not possible to fill the file, too much the invalid character!", "Error!", MessageBoxButtons.OK, MessageBoxIcon.Information);
    tt = false;
    }
    else
    {
    utf8Chars[i - 1] = ' ';
    }
    }
    }
    if (tt == true)
    {
    string englishtext = new string(utf8Chars);
    tbxText.Text = englishtext;
    }
    else
    {
    tbxText.Clear();
    }

    :) és működik a textbox.Clear();
    Köszi!
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd