Türkçe Karakter Sorunu

Başlatan EMG81, 04 Mart 2012, 21:14:23

EMG81

Merhaba,

C# ile içerisinde Türkçe karakterler olan bir metni seri port üzerinden başka bir PC ye gönderirken C# metin içerisindeki türkçe karakterleri "?" karakterine çeviriyor. Yani, Orjinal metin atıyorum "Lütfen" iken giden metin "L?tfen" şekline dönüşüyor. Bunun önüne nasıl geçebilirim ?


kudretuzuner

Merhaba
Aşağıdaki linkte türkçe karakterlerin hex değerleri var.Dataları byte byte HEX olarak yollarsanız sanırım istediğiniz olur.
http://www.table-ascii.com/
Amatör

EMG81

Önerinizde haklısınız. Fakat anladığım kadarı ile C#  Türkçe karakterleri Bastırıyor. C# ı kandırmak yerine bunu yapmamasını istemek daha mantıklı bir çözüm gibi geliyor bana. 

ogunduru

Göndereceğiniz stringi encode etmeyi deneyin. Aşağıdaki methodu programınıza ekleyin. Büyük olasılıkla işiniz çözülecek.

    public string unicodeToTrEncoding(string strIn)
    {
      Encoding enTr = Encoding.GetEncoding("windows-1254");
      Encoding unicode = Encoding.Unicode;

      byte[] unicodeBytes = unicode.GetBytes(strIn);
      byte[] trBytes = Encoding.Convert(unicode, enTr, unicodeBytes);
      char[] trChars = new char[enTr.GetCharCount(trBytes, 0, trBytes.Length)];
      enTr.GetChars(trBytes, 0, trBytes.Length, trChars, 0);
      string trString = new string(trChars);

      return trString;
    }
Matematik Mühendisi bir hobi elektronikçi

mozkan87

Encoding.GetEncoding( );

Yukarıdaki kullanımı araştırıp kullanabilirsiniz. Bu sayede default olanı değiştirmiş oluyoruz.

EMG81

C# ta yeni olduğum için sorunlar da pek hızlı ilerleyemiyorum. Encoding.GetEncoding( ); ile ilgili örnek aşağıda ki linkte mevcut. Fakat tam olarak nereye müdahale etmem gerektiğini anlayamadım.

http://msdn.microsoft.com/en-us/library/t9a3kf7c%28v=VS.95%29.aspx

RcALTIN

#6
seri portu açmadan önce mesela formLoad eventi içinde aşağıdaki kod ile portun Encoding propertysine UTF8 ataması yaparak sorunu çözebilirsiniz...

serialPort1.Encoding = UTF8Encoding.UTF8;


bu arada daha önce türkçe karakterlerle seri iletişime ihtiyaç duyan bir kişiyi ne gördüm, ne duydum; bunu kullanmanın bir sankıncası varsa bilemeyeceğim.
KİMSEYİ ENGELLEDİĞİM YOK, ÖZEL İLETİ DEVRE DIŞI !

EMG81

Alıntı yapılan: RcALTIN - 06 Mart 2012, 18:19:47
seri portu açmadan önce mesela formLoad eventi içinde aşağıdaki kod ile portun Encoding propertysine UTF8 ataması yaparak sorunu çözebilirsiniz...

serialPort1.Encoding = UTF8Encoding.UTF8;


bu arada daha önce türkçe karakterlerle seri iletişime ihtiyaç duyan bir kişiyi ne gördüm, ne duydum; bunu kullanmanın bir sankıncası varsa bilemeyeceğim.

Yazdığınız kod satırı transfer şeklini etkiledi. Fakat Türkçeleştirmedi. Şimdi "?" yerine ascii tablosunda değerini bilmediğim(Olanaklar kısıtlı.. seri portu dinleme şansım yok.) bir karakter gönderiyor.

RcALTIN

Alıntı yapılan: EMG81 - 06 Mart 2012, 20:46:50
Yazdığınız kod satırı transfer şeklini etkiledi. Fakat Türkçeleştirmedi. Şimdi "?" yerine ascii tablosunda değerini bilmediğim(Olanaklar kısıtlı.. seri portu dinleme şansım yok.) bir karakter gönderiyor.

ben denedim, gönderdiğim türkçe karakterler türkçe dönüyorlar sıkıntı yok c# tarafında, sıkıntı karşı tarafta utf8 desteklenmiyor olmasından kaynaklanıyor olsa gerek. pek de anlamam aslında karakter kodlaması işlerinden, bana kalırsa türkçe karakterlerden vazgeçin veya ille de kullanacaksanız farklı yöntemlerle aktarın türkçe karakterleri; farklı sistemlerle uyumluluk açısından iletişimde ascii karakter setinin dışına çıkmak iyi bir fikir değil bence, ileride başınıza iş açabilir. ayrıca seri port dinleme şansınız var, bir özel iletinize yanıt olarak da belirttiğim gibi bu iş için sanal seri port uygulamaları/sürücüleri var, deneme için onları kullanabilirsiniz, bu işlerle ilgileniyorsanız kullanmalısınız da.
KİMSEYİ ENGELLEDİĞİM YOK, ÖZEL İLETİ DEVRE DIŞI !

EMG81

Alıntı yapılan: RcALTIN - 06 Mart 2012, 21:13:35
ben denedim, gönderdiğim türkçe karakterler türkçe dönüyorlar sıkıntı yok c# tarafında, sıkıntı karşı tarafta utf8 desteklenmiyor olmasından kaynaklanıyor olsa gerek. pek de anlamam aslında karakter kodlaması işlerinden, bana kalırsa türkçe karakterlerden vazgeçin veya ille de kullanacaksanız farklı yöntemlerle aktarın türkçe karakterleri; farklı sistemlerle uyumluluk açısından iletişimde ascii karakter setinin dışına çıkmak iyi bir fikir değil bence, ileride başınıza iş açabilir. ayrıca seri port dinleme şansınız var, bir özel iletinize yanıt olarak da belirttiğim gibi bu iş için sanal seri port uygulamaları/sürücüleri var, deneme için onları kullanabilirsiniz, bu işlerle ilgileniyorsanız kullanmalısınız da.

Rica etsem denemelerinizi yaptığınız programınızı upload edebilirmisiniz ?

RcALTIN

#10
Alıntı yapılan: EMG81 - 06 Mart 2012, 21:57:24
Rica etsem denemelerinizi yaptığınız programınızı upload edebilirmisiniz ?

benim bilgisayarımda sanal port COM1'e giden, sanal port COM2'den dönüyor, öyle ayarlı. denemek için yeni bir konsol projesi açıp aşağıdaki kodu aynen içine kopyalayın, namespace yanındaki proje adını değiştirmeyi unutmayın, yada spTest olarak kaydedin yeni açacağınız projeyi. 10 kblik dosya için 3 saat uğraştıracak üyelikle müyelikle dosya upload siteleri diye yüklemedim...

using System;
using System.Collections.Generic;
using System.Text;
using System.IO.Ports;

namespace spTest
{
    class Program
    {
        static SerialPort sp1, sp2;

        static void Main(string[] args)
        {
            sp1 = new SerialPort("COM1");
            sp1.BaudRate = 9600;
            sp1.Encoding = Encoding.UTF8;

            sp2 = new SerialPort("COM2");
            sp2.BaudRate = 9600;
            sp2.Encoding = Encoding.UTF8;
            sp2.DataReceived += new SerialDataReceivedEventHandler(sp2_DataReceived);

            sp1.Open();
            sp2.Open();

            while (true)
            {
                sp1.WriteLine(Console.ReadLine());
            }
        }

        static void sp2_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            Console.WriteLine("Gelen : " + sp2.ReadLine());
        }
    }
}




sp2'nin yani dinlemenin yapıldığı seri portun encoding atamasını sildiğinizde türkçe karakterler yerine ? gözüktüğünü görebilirsiniz, sizin sorunu gözlemleyebilmeniz açısından. sp2 değilde sp1'in encoding atamasını silseniz de aynı sorun ortaya çıkar, bu sefer türkçe karakterlerin yanlış gönderilmesinden kaynaklı...
KİMSEYİ ENGELLEDİĞİM YOK, ÖZEL İLETİ DEVRE DIŞI !

EMG81

Alıntı yapılan: RcALTIN - 06 Mart 2012, 22:15:15
benim bilgisayarımda sanal port COM1'e giden, sanal port COM2'den dönüyor, öyle ayarlı. denemek için yeni bir konsol projesi açıp aşağıdaki kodu aynen içine kopyalayın, namespace yanındaki proje adını değiştirmeyi unutmayın, yada spTest olarak kaydedin yeni açacağınız projeyi. 10 kblik dosya için 3 saat uğraştıracak üyelikle müyelikle dosya upload siteleri diye yüklemedim...

using System;
using System.Collections.Generic;
using System.Text;
using System.IO.Ports;

namespace spTest
{
    class Program
    {
        static SerialPort sp1, sp2;

        static void Main(string[] args)
        {
            sp1 = new SerialPort("COM1");
            sp1.BaudRate = 9600;
            sp1.Encoding = Encoding.UTF8;

            sp2 = new SerialPort("COM2");
            sp2.BaudRate = 9600;
            sp2.Encoding = Encoding.UTF8;
            sp2.DataReceived += new SerialDataReceivedEventHandler(sp2_DataReceived);

            sp1.Open();
            sp2.Open();

            while (true)
            {
                sp1.WriteLine(Console.ReadLine());
            }
        }

        static void sp2_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            Console.WriteLine("Gelen : " + sp2.ReadLine());
        }
    }
}


(Resim gizlendi görmek için tıklayın.)

sp2'nin yani dinlemenin yapıldığı seri portun encoding atamasını sildiğinizde türkçe karakterler yerine ? geldiğini görebilirsiniz.


Şuan donanım ım ne yazıkki yanımda değil. Yarın deneyip sonucu yazacağım. Hyper terminal ve Vb6 da denediğime göre donanım ım çalışıyor. Fakat C# programıma bahsettiğiniz kodu eklediğimde olmamıştı.

EMG81

Alıntı yapılan: EMG81 - 06 Mart 2012, 22:30:07

Şuan donanım ım ne yazıkki yanımda değil. Yarın deneyip sonucu yazacağım. Hyper terminal ve Vb6 da denediğime göre donanım ım çalışıyor. Fakat C# programıma bahsettiğiniz kodu eklediğimde olmamıştı.

Denedim, tam olarak bizim beklentilerimizi karşılamadı. Sonra kodları inceledim ve böyle olması normal gibi :) Çünkü,

Serial port 1 i Encoding = Encoding.UTF8; Kod satırı ile bilgileri Encoding ediyoruz.  Yani Tükçe karakterleri ascii tablosuna göre 130-140-150 inci karakterlerden sonra herhangi bir yere atıyoruz.(Aslında "Ü" karakterinin Ascii tablosunda yeri belli ama UTF8 kodlamasına göre hangi harfler hangi adreslere yerleşiyor bilmiyorum,bilmiyoruz) Sonrada Serial Port2 yi de aynı şekilde Encoding edince PC UTF8 kodlamasında türkçe karakterlerin yerini bildiğinden Gönderdiğimiz Karakteri geri alabiliyoruz. Fakat UTF8 kodlaması Türkçe karakteri olması gereken yerlere koymuyor. Mesela "Ü" = 220 olması gerekirken Çok farklı bir değer alıyor.

EMG81

#13
serialPort1.Encoding = Encoding.Default;

Satırı ile sorun çözülüyor. Bilginizee   ::)