2015-06-06 2 views
2

Я просто хочу использовать символ разделителя ASCII Unit (десятичный 31 и шестнадцатеричный 1F) вместо закладки для файла с разделителями. Я предполагаю, что проблема заключается в кодировании, но я уверен, что не могу найти, как ее изменить. В следующем, я получаю желаемый вывод на консоли в первой строке вывода в моем файле StreamWriter, но во второй строке отсутствует «\ x1f».Использование символа управления ( x1f) со строкой и/или StringBuilder

static StreamWriter sw = null; 

static void Main(string[] args) 
{ 
    try 
    { 
     sw = new StreamWriter(OutFilename, false, Encoding.UTF8); 
    } 
    catch (Exception ex) 
    { 
     Console.WriteLine("File open error: " + ex.Message); 
     return; 
    } 
    // This works 
    Output("From▼To"); // Has a '\x1f' in it 
    // This does not work 
    StringBuilder sb = new StringBuilder(); 
    sb.Append("From"); 
    sb.Append('\x1f'); 
    sb.Append("To"); 
    Output(sb.ToString()); 
    // 
    sw.Close(); 
} 

static void Output(string s) 
{ 
    Console.WriteLine(s); 
    sw.WriteLine(s); 
} 

Выходной файл имеет:

From▼To 
FromTo 

Я хочу построить строку, используя StringBuilder, кроме как с '\ x1f' на выходе.

+0

Вы уверены, что '▼' is '\ x1F'? потому что я получаю '\ x25BC' для этого символа, когда я проверяю массив, возвращаемый с' "From ▼ To" .ToCharArray() ' –

+0

Попробуйте' \ u001f' и сообщите мне, если это работает. – FrankerZ

+0

либо x1F, либо u001F не будут работать, поскольку они не являются печатными символами. Вам нужно найти другого персонажа, который можно использовать для представления этой стрелки. –

ответ

0

Только в случае, если вы хотите испытать свою удачу с таким трюком, вы могли бы написать именно байты вы ожидаете в следующем виде:

Output(Encoding.UTF8.GetBytes(sb.ToString())); 

, если у вас есть еще один Output метод, как это:

static void Output(string s) 
{ 
    Console.WriteLine(s); 
    sw.WriteLine(s); 
} 

static void Output(byte[] bytes) 
{ 
    int dataLength = bytes.Length; 
    List<byte> modified = new List<byte>(); 
    for (int i = 0; i < dataLength; i++) 
    { 
     if (bytes[i] == 0xBC && (i < dataLength - 1) && bytes[i + 1] == 0x25) 
     { 
      modified.Add(0x1F); 
      i++; 
     } 
     else 
     { 
      modified.Add(bytes[i]); 
     } 
    } 
    byte[] data = modified.ToArray(); 
    Console.WriteLine(Encoding.UTF8.GetString(bytes));  // Use this or the next line 
    // Console.WriteLine(Encoding.UTF8.GetString(data)); 
    sw.BaseStream.Write(data, 0, data.Length); 
    sw.WriteLine(); 
} 
+0

ASCII (31) называется «US» (Unit Separator), когда обрабатывается как управляющий символ. Я не знаю, каким будет эффект, используя его внутри кодированного UTF8 текста, но я предполагаю, что вы избегаете использования ASCII из вашего кода 'sw = new StreamWriter (OutFilename, false, Encoding.UTF8);' –

1

Похоже, здесь много путаницы. Позвольте мне посмотреть, могу ли я кое-что прояснить.

Прежде всего, давайте согласимся на следующие моменты, которые легко проверяемые:

'\x1f' == '\u001F' 
'\x1f' == (char)31 
'\x1f' != '▼' // <-- here appears to be your mistaken assumption. 
'▼' == (char)9660 
'▼' == '\u25BC' 

Так что это ...

// This works 
Output("From▼To"); // Has a '\x1f' in it 

... иронически точная линия, которая не работает , В этой строке нет '\x1f'. Символ треугольника не равен '\x1f'. Не знаете, где у вас такое впечатление.

Это приводит нас к последней точке: '\x1f' не является видимым персонажем. Поэтому, когда вы пытаетесь отобразить его на консоли, вы не увидите его, и это на 100% нормальное.

Однако будьте уверены, что когда у вас есть строка с '\x1f' и напишите это в файл, символ все еще там. Но вы никогда не сможете «видеть» его, если вы не прочитаете байты напрямую.

Так как вы можете использовать '\x1f' в качестве разделителя, зависит от того, нужен ли вам ограничитель для видимости. Если да, то вам нужно выбрать другого персонажа. Но если вам это нужно только в качестве разделителя, когда вы программно разбираете файл, то целесообразно использовать '\x1f'.

Смежные вопросы