【问题标题】:how to properly concatenate bidi strings in r?如何在r中正确连接bidi字符串?
【发布时间】:2017-03-25 06:13:21
【问题描述】:

我想为从右到左书写的(乌尔都语)文本添加标记。我正在尝试为此目的使用 gsub,但到目前为止我尝试过的所有操作都没有产生所需的输出

text <- "یہ جملہ ایک مثال کے لیے استعمال کیا جا رہا ہے"
pattern <- "کیا جا"
replaceWith <- paste0("<somemark>", pattern, "</somemark>")
gsub(pattern, replaceWith, text)

gsub 返回以下内容

یہ جملہ ایک مثال کے لیے استعمال <somemark>کیا جا</somemark> رہا ہے

想要的输出。

我怎样才能获得所需的输出?

注意:我什至无法在我的帖子中正确排版所需的输出,我不得不依赖图像。

更新: 虽然下面的mysub 函数正确连接了字符串(在控制台中),但我仍然面临闪亮应用程序中文本顺序不正确的问题。

mysub <- function(text, pattern){
beforePattern <- substr(text, 1, regexpr(pattern, text)[1]-1)
afterPattern <- substr(text, regexpr(pattern,text)[1] + nchar(pattern), nchar(text))
result <- paste(afterPattern, replaceWith, beforePattern)
result
}

【问题讨论】:

  • 嗯,输出基本是反了?这可能是因为字体?是从右往左写的吗? (对不起,我是欧洲人……)
  • 不,据我所知,这不是字体问题

标签: r shiny string-concatenation bidi urdu


【解决方案1】:

gsub其实没有问题:

text <- dput("یہ جملہ ایک مثال کے لیے استعمال کیا جا رہا ہے")
"<U+06CC><U+06C1> <U+062C><U+0645><U+0644><U+06C1> <U+0627><U+06CC><U+06A9>
<U+0645><U+062B><U+0627><U+0644> <U+06A9><U+06D2> <U+0644><U+06CC><U+06D2> 
<U+0627><U+0633><U+062A><U+0639><U+0645><U+0627><U+0644> <U+06A9><U+06CC>
<U+0627> <U+062C><U+0627> <U+0631><U+06C1><U+0627> <U+06C1><U+06D2>"

pattern <- dput("کیا جا")
"<U+06A9><U+06CC><U+0627> <U+062C><U+0627>"

replaceWith <- dput(paste0("<somemark>", pattern, "</somemark>"))
"<somemark><U+06A9><U+06CC><U+0627> <U+062C><U+0627></somemark>"

dput(gsub(pattern, replaceWith, text))
"<U+06CC><U+06C1> <U+062C><U+0645><U+0644><U+06C1> <U+0627><U+06CC><U+06A9> 
<U+0645><U+062B><U+0627><U+0644> <U+06A9><U+06D2> <U+0644><U+06CC><U+06D2> 
<U+0627><U+0633><U+062A><U+0639><U+0645><U+0627><U+0644> <somemark><U+06A9>
<U+06CC><U+0627> <U+062C><U+0627></somemark> <U+0631><U+06C1><U+0627> 
<U+06C1><U+06D2>"

结果的呈现(一个包含从右到左和从左到右字符的字符串)对我来说也很合乎逻辑:

  1. 字符串的开头包含从右到左的字符,因此从右到左呈现

یہ جملہ ایک مثال کے لیے استعمال

  1. 然后字符串从左到右继续。它从左到右渲染并添加到末尾(之前渲染的左侧),

یہ جملہ ایک مثال کے لیے استعمال &lt;somemark&gt;

  1. 然后字符串从右到左字符继续。它从右到左渲染并添加到最后,

یہ جملہ ایک مثال کے لیے استعمال &lt;somemark&gt;کیا جا

  1. 然后字符串从左到右继续。它从左到右呈现并添加到最后,

یہ جملہ ایک مثال کے لیے استعمال &lt;somemark&gt;کیا جا&lt;/somemark&gt;

  1. 最后字符串以从右到左的字符结尾。它从右到左呈现并添加到末尾。

یہ جملہ ایک مثال کے لیے استعمال &lt;somemark&gt;کیا جا&lt;/somemark&gt; رہا ہے

在我看来,您对应该渲染什么的想法并不合乎逻辑,但我必须承认我没有从右到左文本渲染的经验。

无论如何,如果格式必须由渲染器解释,如 HTML 中的 &lt;b&gt;...&lt;/b&gt; 标签,那么它可以完美地工作(在 markdown/html 中):

یہ جملہ ایک مثال کے لیے استعمال &lt;b&gt;کیا جا&lt;/b&gt; رہا ہے

呈现为

یہ جملہ ایک مثال کے لیے استعمال کیا جا رہا ہے

我没有设法用闪亮的问号打印任何东西:

???? ???????? ?????? ???????? ???? ?????? ?????????????? &lt;somemark&gt;?????? ????&lt;/somemark&gt; ?????? ????

【讨论】:

  • 正如你提到的渲染在 markdown+html 中完美工作,在闪亮中渲染是有问题的。是否可以附加 unicode 控制字符来指示字符串从右到左和从左到右呈现?
  • @ImranAli,是的,unicode 控制字符在这里很有用:gsub(pattern, replaceWith, paste0("\u202b", text, "\u202c")) 似乎有效。请参阅我的回答 here 了解更多详情。
【解决方案2】:

我试了一下。不过,我确实冒昧地对 args 进行硬编码,而不是从会话中读取。

Server: 

output$mysub <- function(){ # (text=NULL, pattern=NULL)

text <- "یہ جملہ ایک مثال کے لیے استعمال کیا جا رہا ہے"
pattern <- "کیا جا"

Encoding(text) <- "UTF-8"
Encoding(pattern) <- "UTF-8"

print(text)

beforePattern <- substr(text, 1, regexpr(pattern, text)[1]-1)
afterPattern <- substr(text, regexpr(pattern,text)[1] + nchar(pattern), nchar(text))

replaceWith <- paste0("<somemark>", pattern, "</somemark>")
result <- paste(afterPattern, replaceWith, beforePattern)

# result <- paste( beforePattern, replaceWith, afterPattern)
# Encoding(result) <- "UTF-8"
print(length(result))
print(result)

return(result)
}


# ui.R: 

h2( textOutput("mysub") )

我在闪亮网页上得到的输出是:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 2020-01-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多