2010-06-24 6 views
3

J'écris l'application C# qui a besoin d'imprimer des données à l'imprimante POS STAR en utilisant RawPrinterHelper.Comment encoder des chaînes comme éditer en C#?

Mon impression fonctionne correctement, sauf lorsque j'envoie des caractères comme ŽÃ ©. Ensuite, je me trompe de données imprimées.

Jusqu'à maintenant mes recherches m'ont donné les résultats suivants.

Si je en open PowerShell bon vieux éditer et dans le fichier txt écrire mes personnages (ŽĆČĐŠ) et d'envoyer ce à l'imprimante, je reçois imprimer comme je souhaite

Je ne peux pas que répétition à l'aide Bloc-notes

Comment je peux en C# encoder ma piqûre pour ressembler à celle de l'invite de commande (EIDTor). Donc lorsque j'envoie des données à l'imprimante, il imprime des polices de désir comme il ressemble à un environnement Windows.

J'ai également essayé d'imprimer à l'aide du pilote Star et de leur exemple C# pour envoyer des données directement à l'imprimante mais sans succès.

EDIT:


je l'ai fait, et pour d'autres qui en ont généralement des difficultés d'impression directement sur les imprimantes étoile en utilisant C# ici est le code pour l'application de l'échantillon de Star IO Programming Tool pour l'utilisation de leur chauffeur.

using System; 
using System.Text; 
using StarMicronics.StarIO; // added as a reference from the "Dependencies" directory 
          // requires StarIOPort.dll, which is copied to the output directory by the Post-Build event 

namespace TestEnkodera 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string portName = "LPT1"; 
      string portSettings = string.Empty; 
      string print = string.Empty; 

      //Select code page 
      //Decimal 27 29 116 n 
      print += string.Format("{0}{1}{2}{3}{4}", (char)27, (char)29, (char)116, (char)5, Environment.NewLine); 

      print += "Đ Š Ž Ć Č ž ć č ć \n";    

      IPort port = null; 
      port = StarMicronics.StarIO.Factory.I.GetPort(portName, portSettings, 10 * 1000); 
      //byte[] command = ASCIIEncoding.ASCII.GetBytes(print); //This was orginal code provided by STAR 

      Encoding ec = Encoding.GetEncoding(852); //Here is way to set CODEPAGE to match with printer CODE PAGE 
      byte[] command = ec.GetBytes(print); 
      uint totalSizeCommunicated = WritePortHelper(port, command); 
      StarMicronics.StarIO.Factory.I.ReleasePort(port); 
      Console.ReadKey(); 
     } 
     private static uint WritePortHelper(IPort port, byte[] writeBuffer) 
     { 
      uint zeroProgressOccurances = 0; 
      uint totalSizeCommunicated = 0; 
      while ((totalSizeCommunicated < writeBuffer.Length) && (zeroProgressOccurances < 2)) // adjust zeroProgressOccurances as needed 
      { 
       uint sizeCommunicated = port.WritePort(writeBuffer, totalSizeCommunicated, (uint)writeBuffer.Length - totalSizeCommunicated); 
       if (sizeCommunicated == 0) 
       { 
        zeroProgressOccurances++; 
       } 
       else 
       { 
        totalSizeCommunicated += sizeCommunicated; 
        zeroProgressOccurances = 0; 
       } 
      } 
      return totalSizeCommunicated; 
     } 
    } 
} 
+0

Il semble que l'encodage de l'éditeur de texte utilise est le identique à celui utilisé par l'imprimante. Votre éditeur indique-t-il quel encodage est utilisé? – Kurt

+0

@Kurt J'utilise EDITOR dans l'invite de commande comme dans MS DOS. Bleu sans souris, je pense que je ne peux pas savoir quel encodage utiliser – adopilot

+0

Essayez d'ouvrir ce fichier dans le Bloc-notes. Faites un "Enregistrer sous" pour voir quel encodage est enregistré? Je devine que ce sera ASCII & votre code C# essaye de l'écrire en Unicode (UTF-8/16). – shahkalpesh

Répondre

4

Si vous utilisez l'éditeur DOS, vous avez affaire à un encodage hérité.

Jetez un oeil à ce lien: http://msdn.microsoft.com/en-us/library/cc488003.aspx

À un certain moment vous convertissant les caractères en octets pour les envoyer à l'imprimante. Vous faites probablement cela en utilisant un StreamWriter ou plus. Vous devez maintenant fournir à ce "convertisseur" l'encodage correct, qui à la fin convertit les caractères en une représentation correcte des octets pour l'imprimante, de sorte que les caractères étendus correspondent.

Une liste des encodages (pour les pages de code DOS) peut être trouvée ici: http://msdn.microsoft.com/en-us/library/system.text.encoding.aspx - une commune est ibm850 (Europe occidentale).

Edit: Je trouve les informations suivantes en ligne, peut-être aide (je pense en fait que la page de code 0 « Normal » est #850 Latin-1):

Star Micronics Character Code Tables Reference 

Code Page | Description 
0   | Normal 
1   | #437 USA, Std Europe 
2   | Katakana 
3   | #437 USA, Std Europe 
4   | #858 Multilingual 
5   | #852 Latin-2 
6   | #860 Portuguese 
7   | #861 Icelandic 
8   | #863 Canadian French 
9   | #865 Nordic 
10  | #866 Cyrillic Russian 
11  | #855 Cyrillic Bulgarian 
12  | #857 Turkey 
13  | #852 Israel 
14  | #864 Arabic 
15  | #737 Greek 
16  | #851 Greek 
17  | #869 Greek 
18  | #929 Greek 
19  | #772 Lithuanian 
20  | #774 Lithuanian 
21  | #874 Thai 
+0

Merci pour toutes ces informations utiles. Je parle de l'éditeur de MsDos et ma page de code est 852 si je le mets sur l'imprimante ou dans mon code. – adopilot

+0

@adopilot, ils ont juste besoin de faire correspondre.Par conséquent, si vous le définissez sur "table de codes de caractères 5" sur l'imprimante, vous devez utiliser l'encodage nommé "ibm852" sur le côté .NET et le caractère doit correspondre correctement. – Lucero

Questions connexes