[英]Remove double backslashes c# (for use ESC/POS programming)
我已經待了很長時間了,看來我的問題已廣為人知。 但是,所有給出的答案對我都行不通。 大多數時候,人們說“沒有問題”。
問題:我正在編程POS解決方案,並且正在使用Epson POS打印機。 要將臀部打印到收據上,我正在數據庫中存儲一個字符串。 這樣,用戶就可以調整收據底部的文本。 但是,當我從數據庫中提取字符串時,C#在字符串中添加了斜杠,因此我的排字字符將無法工作。 我知道,這通常不是問題,但就我而言,是這樣,因為我的ECS / POS命令不起作用。
我已經嘗試過一些腳本,用單\\代替雙\\,但是它們不起作用。 (例如String.Replace(@'\\\\',@'\\')。
問題:
我有一個刺:“ foo \\ n bar”
需要打印為:
富
酒吧
C#添加斜杠:“ foo \\\\ n bar”
現在將其打印為:foo \\ n bar
有人知道嗎?
問題是對C#如何處理字符串的誤解。 采取以下示例代碼:
string foo = "a\nb";
int fooLength = foo.Length; \\ 3 characters.
int bar = (int)(foo[1]); \\ 10 = linefeed character.
與:
string foo = @"a\nb"; \\ NB: @ prefix!
int fooLength = foo.Length; \\ 4 characters.
int bar = (int)(foo[1]); \\ 92 = backslash character.
第一個示例使用字符串文字( "a\\nb"
),C#編譯器將其解釋為產生三個字符。 第二個示例使用前綴@的逐字字符串文字 ,它禁止對該字符串進行解釋。
請注意,調試器旨在通過顯示添加了轉義碼的字符串來增加混亂,例如: string foo = "a\\nb" + (Char)9;
導致調試器顯示為"a\\nb\\t"
的字符串。 如果在調試器中使用“文本可視化器”(在檢查變量的值時單擊放大鏡),則可以看到文字字符和解釋字符之間的區別。
通常,數據庫旨在不經解釋地接受和返回字符串值。 這樣,您就不必擔心“ Delete D'table”之類的名稱。 SQL關鍵字的存在或SQL語句中使用的標點都不應該在data列中出現問題。
現在,OP的問題應該變得更加清晰。 從數據庫檢索的字符串不包含換行符,而是包含字符“ \\”和“ n”。 從數據庫讀取字符串並將其寫入打印機時,.NET沒有理由更改這些值。 不幸的是,調試器混淆了兩者之間的差異。 (如上所述,使用文本可視化器。)
該解決方案涉及添加代碼以重現C#編譯器對轉義序列的處理。 (這應該包括轉義的轉義字符!)或者,可以添加適合於當前應用程序的令牌,例如,可以用ASCII轉義字符替換出現的«ESC»
。 這可以用於更長的序列,例如,如果印刷品使用多個字符進行字體更改,然后編寫代碼以正確的序列替換«SetFont»
。 通常,您可以用動態值替換代碼段 ,例如,在打印收據時,可以將«Now»
替換為當前日期/時間。 (寄存器號,收銀員姓名,營業時間等。)這使得數據庫中的值比嵌入式Unicode奇數更易於閱讀,比固定字符串更靈活。
留給讀者練習:擴展代碼片段以支持格式設置和空值替換。 «Now|DD.MM.YY hh:mm»
指定格式, «Discount|*|n/a»
指定字段為空時要顯示的值(“ n / a”)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.