当前位置: 首页 > 知识库问答 >
问题:

c#的音译。net 4.0?

程祺
2023-03-14

我是编程新手。这是我的代码:

  public string ThanglishToTamilList(char[] characters, int length) {
        var dict1 = new Dictionary<string, string>();

        dict1.Add("a", "\u0B85"); // அ
        dict1.Add("aa", "\u0B86"); // ஆ
        dict1.Add("A", "\u0B86"); // ஆ
        dict1.Add("i", "\u0B87"); // இ
        dict1.Add("ee", "\u0B88"); // ஈ
        dict1.Add("I", "\u0B88"); // ஈ
        dict1.Add("u", "\u0B89"); // உ
        ...



        List<String> list = new List<String>();
        string[] array;
        var valueOfDictOne = "";

        for (int i = 0; i < length; i++)
        {                
            try
            {
                valueOfDictOne = dict1[characters[i].ToString()];
                list.Add(valueOfDictOne);

            }
            catch
            {
                list.Add(characters[i].ToString());
            }
        }

        array = list.ToArray();
        string result = string.Join("", array);
        return result;
    }

函数参数详细信息:

char[]字符:字符数组(textbox.text.ToCharArray())

int长度:数组的长度。(没有我们在文本框中键入的字符)

我的预期输出应该是:

如果用户键入-

同样地:

a-

aa-

A-

请注意,aa

我的问题:这段代码只替换了一个字符(a-

但是如果我们输入aa,输出是

aa-

但是我需要正确的输出

aa-

我已经为此添加了一些代码行。但这并不奏效:

        ...
        for (int i = 0; i < length; i++)
        {                
            try
            {

                if (String.Equals(characters[i], "a") && !(String.Equals(characters[i], "aa")))
                {

                    //MessageBox.Show("a");

                    valueOfDictOne = dict1[characters[i].ToString()];
                    list.Add(valueOfDictOne);
                }
                else if (String.Equals(characters[i], "aa"))
                {
                    //MessageBox.Show("aa");

                    valueOfDictOne = dict1[characters[i].ToString()];
                    list.Add(valueOfDictOne);
                }

            }
            catch
            {
                list.Add(characters[i].ToString());
            }
        }

...

请帮助我纠正这个代码,或者请提供任何简单的替代方法来音译。

谢谢你。

共有2个答案

卫嘉佑
2023-03-14

我认为你应该彻底改变你的方法来有效地解决这个问题。基于一个字符是给你无效的结果,因为一些序列以字典中已经存在的有效序列开始。

我认为您应该做的是在一些临时字符串中添加字符,只要存在有效的字典条目。若附加到此临时字符串的下一个字符将不在字典中,那个么您将处理字符串替换并从新的临时字符串开始
当然,这个解决方案在某些方面并不理想-如果我们有stringaaa应该如何处理?解决方案假定首先使用最长的匹配表达式(第一点),但这不是必要的有效方法。

  • aaa

但您需要在业务层面上以某种方式解决这个问题。

下面的示例伪代码:

foreach(char character in characters)
{
    if (!substitutionDict.ContainsKey(tempString + character))
    {
        makeSubstitution(tempString, substitutionDict[tempString]);
        tempString = String.Empty;
    }
    tempString += character;
}

编辑:
此方法主要适用于键入时的处理。我不确定这种解决方案对于较长文件的性能。在处理已经创建的文件时,最好从另一个角度看:寻找模式并替换它们。

foreach (string pattern in substitutionDict.Keys.OrderByDesc(x => x.Length))
{
    makeSubstitution(pattern, substitutionDict[pattern]);
}
咸昊昊
2023-03-14

您可以使用一个简单的解析器/词法分析器来标记输入字符串。然后您的thanglishtamillist函数将如下所示:

...
TextReader r = new StringReader(characters);
Lexer l = new Lexer(r, defs);
while (l.Next())
{
  list.Add(dict1[l.TokenContents]);
}
...

您可以在这里找到一个简单解析器/词法分析器的示例:C语言的穷人的“词法分析器”#

对你的问题来说,这可能有些过分,但它应该能完成工作。

 类似资料:
  • 问题内容: 有什么解决方案可以将所有外来字符转换为等效的Az?我在Google上进行了广泛的搜索,找不到解决方案,甚至找不到字符和等效项的列表。原因是我想只显示Az的URL,以及处理这些字符时显示的其他许多提示。 问题答案: 您可以使用具有特殊音译编码的iconv。 当字符串“ // TRANSLIT”附加到tocode时,音译被激活。这意味着当一个字符不能在目标字符集中表示时,可以通过一个或几个

  • 上一个小节 C 语言的程序结构中我们简单的认识了一下 C 语言的程序到底由那些部分组成,但是仅仅了解 C 语言的程序结构还不够,仅仅是万里长征走完了第一步,后面还需要进行很多的步骤才能让程序成为一个可以使用的工业产品。还记的上一个小节中我们提到的 gcc 吗?其实这是一个 C 语言的编译器,这一个小节我们就来学习一下编译器这个概念。 1. C 语言编译器 每个语言都需要编译器,甚至包括可以直接操作

  • 问题内容: 我想知道是否有人对c的最佳linux音频库有什么看法。我正在学习,并且正在使用力宝上的音频输出进行实验。 编辑:现在我要做的就是放出频率音。 问题答案: 您可以尝试FMod。你可以在这里得到它。 它具有高级api,支持许多编程语言和操作系统。可以播放和编码许多音频格式,还支持3d声音等等。它对于非商业用途是免费的,并且具有各种商业用途的许可模式。

  • 本文向大家介绍C++ 用Clang编译,包括了C++ 用Clang编译的使用技巧和注意事项,需要的朋友参考一下 示例 由于锵前端被设计为是与GCC兼容,当你交换可通过GCC编译大多数程序将编译g++通过clang++在构建脚本。如果没有-std=version给出,将使用gnu11。 习惯了MSVC的Windows用户可以cl.exe与交换clang-cl.exe。默认情况下,clang尝试与已安

  • 问题内容: 在编译C 时,您当然会为要编译的目标平台使用编译器。是否有针对JVM的C 编译器(因此,不是使用Java“本机”接口,而是将C ++代码编译为Java字节码)? 问题答案: NestedVM为Java字节码提供二进制转换。这是通过让GCC编译为MIPS二进制文件然后将其转换为Java类文件来完成的。因此,任何用C,C ++,Fortran或GCC支持的任何其他语言编写的应用程序都可以在

  • 我有以下代码: 我希望它输出“0,1,2,3”并停止,但它输出的是一系列无穷无尽的“0、1、2、3、4、5……” 看起来比较< code>di 如果我只是注释掉< code >,delta=mc[di],我会正常得到“0,1,2,3”。无辜作业有什么问题? 我正在使用Ideone.com g14带-O2选项。