如何在 r 中正确连接 bidi 字符串?
how to properly concatenate bidi strings in r?
我想为从右到左书写的(乌尔都语)文本添加标记。我正在尝试为此目的使用 gsub 但到目前为止我尝试的一切都没有产生所需的输出
text <- "یہ جملہ ایک مثال کے لیے استعمال کیا جا رہا ہے"
pattern <- "کیا جا"
replaceWith <- paste0("<somemark>", pattern, "</somemark>")
gsub(pattern, replaceWith, text)
gsub returns 以下
یہ جملہ ایک مثال کے لیے استعمال <somemark>کیا جا</somemark> رہا ہے
期望的输出。
我怎样才能达到预期的输出?
注意:我什至无法在 post 中正确排版所需的输出,我不得不依赖图像。
更新: 尽管下面的 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
}
其实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>"
结果的呈现(包含从右到左和从左到右字符的字符串)对我来说也很合乎逻辑:
- 字符串的开头包含从右到左的字符,因此从右到左呈现
یہ جملہ ایک مثال کے لیے استعمال
- 然后字符串继续从左到右的字符。它从左到右渲染并添加到最后(之前渲染的左侧),
یہ جملہ ایک مثال کے لیے استعمال <somemark>
- 然后字符串以从右到左的字符继续。它从右到左呈现并在最后添加,
یہ جملہ ایک مثال کے لیے استعمال <somemark>کیا جا
- 然后字符串继续从左到右的字符。它从左到右渲染并在最后添加,
یہ جملہ ایک مثال کے لیے استعمال <somemark>کیا جا</somemark>
- 最后字符串以从右到左的字符结尾。它从右到左呈现并添加到最后。
یہ جملہ ایک مثال کے لیے استعمال <somemark>کیا جا</somemark> رہا ہے
在我看来,您关于应呈现的内容的想法不太合乎逻辑,但我必须承认我没有从右到左文本呈现的经验。
无论如何,如果格式必须由渲染器解释,如 HTML 中的 <b>...</b>
标记,那么它可以完美地工作(在 markdown/html 中):
یہ جملہ ایک مثال کے لیے استعمال <b>کیا جا</b> رہا ہے
呈现为
یہ ̶ملو اوْ مثال کو لوو استعمال کیا ♬ رہا ہے
除了问号,我什么都没打印出来:
???? ???????? ?????? ???????? ???? ?????? ?????????????? <somemark>?????? ????</somemark> ?????? ????
我试了一下。不过,我确实冒昧地对 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") )
我在 shiny 网页上得到的输出是:
我想为从右到左书写的(乌尔都语)文本添加标记。我正在尝试为此目的使用 gsub 但到目前为止我尝试的一切都没有产生所需的输出
text <- "یہ جملہ ایک مثال کے لیے استعمال کیا جا رہا ہے"
pattern <- "کیا جا"
replaceWith <- paste0("<somemark>", pattern, "</somemark>")
gsub(pattern, replaceWith, text)
gsub returns 以下
یہ جملہ ایک مثال کے لیے استعمال <somemark>کیا جا</somemark> رہا ہے
期望的输出。
我怎样才能达到预期的输出?
注意:我什至无法在 post 中正确排版所需的输出,我不得不依赖图像。
更新: 尽管下面的 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
}
其实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>"
结果的呈现(包含从右到左和从左到右字符的字符串)对我来说也很合乎逻辑:
- 字符串的开头包含从右到左的字符,因此从右到左呈现
یہ جملہ ایک مثال کے لیے استعمال
- 然后字符串继续从左到右的字符。它从左到右渲染并添加到最后(之前渲染的左侧),
یہ جملہ ایک مثال کے لیے استعمال <somemark>
- 然后字符串以从右到左的字符继续。它从右到左呈现并在最后添加,
یہ جملہ ایک مثال کے لیے استعمال <somemark>کیا جا
- 然后字符串继续从左到右的字符。它从左到右渲染并在最后添加,
یہ جملہ ایک مثال کے لیے استعمال <somemark>کیا جا</somemark>
- 最后字符串以从右到左的字符结尾。它从右到左呈现并添加到最后。
یہ جملہ ایک مثال کے لیے استعمال <somemark>کیا جا</somemark> رہا ہے
在我看来,您关于应呈现的内容的想法不太合乎逻辑,但我必须承认我没有从右到左文本呈现的经验。
无论如何,如果格式必须由渲染器解释,如 HTML 中的 <b>...</b>
标记,那么它可以完美地工作(在 markdown/html 中):
یہ جملہ ایک مثال کے لیے استعمال <b>کیا جا</b> رہا ہے
呈现为
یہ ̶ملو اوْ مثال کو لوو استعمال کیا ♬ رہا ہے
除了问号,我什么都没打印出来:
???? ???????? ?????? ???????? ???? ?????? ?????????????? <somemark>?????? ????</somemark> ?????? ????
我试了一下。不过,我确实冒昧地对 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") )
我在 shiny 网页上得到的输出是: